次のような複雑なJSON配列とハッシュでアイテムを検索する場合:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
アイテムin [0].objects where id = 3
を見つけるために使用できるクエリ言語はありますか?
JSONQueryはJSONPathのスーパーセットであるため、 dojoで置き換える と思います。次に、 RQL もあります。
Dojoドキュメントから:
JSONQueryはJSONPathの拡張バージョンであり、セキュリティ、使いやすさ、フィルタリング、再帰的検索、並べ替え、マッピング、範囲選択、ワイルドカード文字列比較とさまざまな演算子を使用した柔軟な式などの包括的なデータクエリツールセットを備えています。
JSONselect には質問に関する別の視点(XPathではなく、CSSセレクターのような)があり、 JavaScript実装 があります。
私が知っている他の選択肢は
HTH。
JSONデータを走査/フィルタリングするための現在のオプションの一部を要約し、いくつかの構文例を提供するには...
JSPath.automobiles{.maker === "Honda" && .year > 2009}.model
json:select() (CSSセレクターにもっと触発された).automobiles .maker:val("Honda") .model
JSONPath (XPathにより影響を受けた)$.automobiles[?(@.maker='Honda')].model
私はJSPathが一番いいと思うので、AngularJS + CakePHPアプリと統合してみます。
(私はもともとこの答えを 別のスレッド に投稿しましたが、ここでも役立つと思いました。)
JSPath を使用してみてください
JSPathは、ドメイン固有言語(DSL)であり、JSONドキュメント内のデータをナビゲートおよび検索できます。 JSPathを使用すると、JSONのアイテムを選択して、含まれるデータを取得できます。
XMLのXPathのようなJSONのJSPath。
Node.jsと最新のブラウザーの両方に最適化されています。
プロセッサがJSONサポートを提供している場合、XQueryを使用してJSONを照会できます。これは、「id」= 1のオブジェクトを見つけるためにBaseXを使用する方法の簡単な例です。
json:parse('[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]')//value[.//id = 1]
Defiant.js も非常にクールに見えます。ここに簡単な例を示します。
var obj = {
"car": [
{"id": 10, "color": "silver", "name": "Volvo"},
{"id": 11, "color": "red", "name": "Saab"},
{"id": 12, "color": "red", "name": "Peugeot"},
{"id": 13, "color": "yellow", "name": "Porsche"}
],
"bike": [
{"id": 20, "color": "black", "name": "Cannondale"},
{"id": 21, "color": "red", "name": "Shimano"}
]
},
search = JSON.search(obj, '//car[color="yellow"]/name');
console.log( search );
// ["Porsche"]
var reds = JSON.search(obj, '//*[color="red"]');
for (var i=0; i<reds.length; i++) {
console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano
Json Pointer もサポートを増やしているようです。
ObjectPath はXPathやJSONPathに似たクエリ言語ですが、算術計算、比較メカニズム、組み込み関数が組み込まれているため、はるかに強力です。構文を参照してください。
ショップですべての赤い色と50未満の価格の靴を見つける
$ .. shoes。* [色は「赤」で価格<50]
Jsel は素晴らしく、実際のXPathエンジンに基づいています。 XPath式を作成して、オブジェクト(文字列も)だけでなく、あらゆるタイプのJavaScriptデータを検索できます。
カスタムスキーマとマッピングを作成して、XPathエンジンによるデータの歩き方を完全に制御できます。スキーマは、データ、要素、子、属性、およびノード値の定義方法を定義する方法です。その後、自分に合った表現を作成できます。
質問からのJSONを含むdata
という変数がある場合、jselを使用して次のように記述できます。
jsel(data).select("//*[@id=3]")
これは、id
属性が3のノードを返します。属性は、オブジェクト内のプリミティブ(文字列、数値、日付、正規表現)値です。
何らかのクエリ言語がありますか...
jq は、JSONqJSONPathに非常に類似した非常に言語を定義します-を参照 https://github.com/stedolan/jq/wiki/For-JSONPath-users
... [どれ] id = 3の[0] .objectsでアイテムを見つけるのに使用できますか?
これは、オブジェクトがどこにあっても、id == 3の指定されたキーの下にあるすべてのJSONオブジェクトを見つけることを意味すると想定します。対応するjqクエリは次のとおりです。
.[0].objects | .. | objects | select(.id==3)
ここで、「|」 (シェルパイプコマンドのように)パイプ演算子であり、セグメント ".. | objects"が "オブジェクトがどこにあってもよい"に対応する場所です。
Jqの基本は、大部分が明白であるか直感的であるか、少なくとも非常に単純であり、コマンドシェルパイプに精通していれば、残りのほとんどは簡単に理解できます。 jq FAQ には、チュートリアルなどへのポインタがあります。
jqは、CRQ操作をサポートするという点でもSQLに似ていますが、jqプロセッサは入力を上書きしません。 jqはJSONエンティティのストリームも処理できます。
JSON指向のクエリ言語を評価する際に考慮したい他の2つの基準は次のとおりです。
@Naftule-「defiant.js」を使用すると、XPath式を使用してJSON構造を照会できます。このエバリュエーターをチェックして、それがどのように機能するかを理解してください。
http://www.defiantjs.com/#xpath_evaluator
JSONPathとは異なり、「defiant.js」は、JSON構造上のXPathのクエリ構文の全面的なサポートを提供します。
Defiant.jsのソースコードは次の場所にあります。
https://github.com/hbi99/defiant.js
あなたが私のようで、パスベースのルックアップをしたいだけで、実際のXPathを気にしない場合、lodashの _.get()
は機能します。 lodashドキュメントの例:
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// → 3
_.get(object, ['a', '0', 'b', 'c']);
// → 3
_.get(object, 'a.b.c', 'default');
// → 'default'
これを試してみてください- https://github.com/satyapaul/jpath/blob/master/JSONDataReader.Java
これは、xmlのxpathの同様の行での非常に単純な実装です。 jpathとしての名前です。