2007/06/20
JSON にクエリをなげるライブラリを書いてみた
私用で必要になりそうなので(というより誰かがちゃんとしたものを実装してくれるまでの間にあわせ)。
https://kserver.panicode.com/panicode/jsonquery/
var People = [ { Name: 'Alice', Address: { Country: 'Japan', Zip: 1234 }, Age: 20, Hobby: ['Shopping', 'Reading'] }, { Name: 'VeryVeryLongName', Address: { Country: 'Japan' }, Age: 50 }, { Name: 'Bob', Address: { Country: 'America', Zip: 0, }, Age: 30, Hobby: 'Reading' } ];
という JSON を用意しておく。
プロパティにアクセスする
// .Identifier で Identifier にアクセスする JSONQuery.query(People, '.length'); // => [3] // . なしでも可能 JSONQuery.query(People, 'length'); // => [3]
配列にアクセスする
// # で配列の要素に対する操作であることを明示しておく JSONQuery.query(People, '#Name'); // => ["Alice", "VeryVeryLongName", "Bob"] // #.Name も同じ
もちろんアクセスを連続させることも可能
JSONQuery.query(People, '#Address.Country'); // => ["Japan", "Japan", "America"]
条件を指定する
// [COND] で条件を指定可能 // 現在のところ A < B, A <= B, A > B, A >= B, A = B のみ可能 JSONQuery.query(People, '#Name[.length < 10]'); // => ["Alice", "Bob"] JSONQuery.query(People, '#[.Address.Country = "Japan"][.Age < 30].Name'); // => ["Alice"]
意図した結果?
JSONQuery.query(People, '#Hobby.length'); // => [2, 7]
全ての要素を列挙する
JSONQuery.query(People, '..Age'); // => [20, 50, 30] // 実は . == / だったりして JSONQuery.query(People, '//Age'); // => [20, 50, 30]
すごく中途半端だけどこんな感じ。 JSON に限定せず JavaScript の構造に対してクエリをなげることも可能なんだけど(関数呼び出しとか)面倒なのでとにかく放置。 XPath を意識した実装になってるけど `../' みたいなことができない時点でだめだ。あと OR 条件が指定できないとか。まあ必要になったら拡張していきます。
- Category(s)
- program
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/jsonquery/tbping