web-dev-qa-db-ja.com

XQuery / XPathに相当するJSONはありますか?

次のような複雑なJSON配列とハッシュでアイテムを検索する場合:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

アイテムin [0].objects where id = 3を見つけるために使用できるクエリ言語はありますか?

201
Naftuli Kay

うん、それは JSONPath と呼ばれます。現在、ソースは GitHub にあります。

また、 DOJO に統合されています。

115

JSONQueryはJSONPathのスーパーセットであるため、 dojoで置き換える と思います。次に、 RQL もあります。

Dojoドキュメントから:

JSONQueryはJSONPathの拡張バージョンであり、セキュリティ、使いやすさ、フィルタリング、再帰的検索、並べ替え、マッピング、範囲選択、ワイルドカード文字列比較とさまざまな演算子を使用した柔軟な式などの包括的なデータクエリツールセットを備えています。

JSONselect には質問に関する別の視点(XPathではなく、CSSセレクターのような)があり、 JavaScript実装 があります。

20
Brian Clozel

私が知っている他の選択肢は

  1. JSONiq 仕様。言語の2つのサブタイプを指定します。1つはXMLの詳細を非表示にし、JSに似た構文を提供し、もう1つはJSONコンストラクターなどでXQuery構文を強化します。 Zorba JSONiqを実装します。
  2. コロナ 。MarkLogicの上に構築され、XML、JSON、テキスト、バイナリコンテンツを保存、管理、検索するためのRESTインターフェイスを提供します。
  3. MarkLogic 6以降は、すぐにコロナと同様のRESTインターフェースを提供します。
  4. MarkLogic 8以降は、XQueryとサーバーサイドJavaScript環境の両方でJSONをネイティブにサポートします。 XPathを適用できます。

HTH。

17
grtjn

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アプリと統合してみます。

(私はもともとこの答えを 別のスレッド に投稿しましたが、ここでも役立つと思いました。)

16
Simon East

JSPath を使用してみてください

JSPathは、ドメイン固有言語(DSL)であり、JSONドキュメント内のデータをナビゲートおよび検索できます。 JSPathを使用すると、JSONのアイテムを選択して、含まれるデータを取得できます。

XMLのXPathのようなJSONのJSPath。

Node.jsと最新のブラウザーの両方に最適化されています。

13
dfilatov

プロセッサがJSONサポートを提供している場合、XQueryを使用してJSONを照会できます。これは、「id」= 1のオブジェクトを見つけるためにBaseXを使用する方法の簡単な例です。

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]
9
Christian Grün

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
7
Epoc

Json Pointer もサポートを増やしているようです。

7
karlfreeman

ObjectPath はXPathやJSONPathに似たクエリ言語ですが、算術計算、比較メカニズム、組み込み関数が組み込まれているため、はるかに強力です。構文を参照してください。

ショップですべての赤い色と50未満の価格の靴を見つける

$ .. shoes。* [色は「赤」で価格<50]

6
Ela Bednarek

Jsel は素晴らしく、実際のXPathエンジンに基づいています。 XPath式を作成して、オブジェクト(文字列も)だけでなく、あらゆるタイプのJavaScriptデータを検索できます。

カスタムスキーマとマッピングを作成して、XPathエンジンによるデータの歩き方を完全に制御できます。スキーマは、データ、要素、子、属性、およびノー​​ド値の定義方法を定義する方法です。その後、自分に合った表現を作成できます。

質問からのJSONを含むdataという変数がある場合、jselを使用して次のように記述できます。

jsel(data).select("//*[@id=3]")

これは、id属性が3のノードを返します。属性は、オブジェクト内のプリミティブ(文字列、数値、日付、正規表現)値です。

6
Ali

何らかのクエリ言語がありますか...

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つの基準は次のとおりです。

  • 正規表現をサポートしていますか? (jq 1.5はPCRE正規表現を包括的にサポートしています)
  • チューリング完全ですか? (うん)
5
peak

@Naftule-「defiant.js」を使用すると、XPath式を使用してJSON構造を照会できます。このエバリュエーターをチェックして、それがどのように機能するかを理解してください。

http://www.defiantjs.com/#xpath_evaluator

JSONPathとは異なり、「defiant.js」は、JSON構造上のXPathのクエリ構文の全面的なサポートを提供します。

Defiant.jsのソースコードは次の場所にあります。
https://github.com/hbi99/defiant.js

4
Hakan Bilgin

あなたが私のようで、パスベースのルックアップをしたいだけで、実際の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'
1
adittes

これを試してみてください- https://github.com/satyapaul/jpath/blob/master/JSONDataReader.Java

これは、xmlのxpathの同様の行での非常に単純な実装です。 jpathとしての名前です。

0
Satyajit Paul