Personal tools
You are here: Home ブログ matsuyama JSON にクエリをなげるライブラリを書いてみた
Document Actions

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
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.