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


221

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

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

アイテムの検索に使用できるクエリ言語はありますin [0].objects where id = 3か?


作成しない限り、そうではありません。クエリはサーバーに任せ、RESTを使用して必要なデータのみを取得します。
zzzzBov

5
+1良いアイデア。明日これを書くつもりです

2
XPathではありませんが、JLinqはかなり良い(コードをのように読み上げるin(...).where(...).select(...))ことがわかりました:hugoware.net/Projects/jLinq
pimvdb 2011

4
多くのライブラリが存在するため、これはイライラしますが、一般に受け入れられている標準に近づくものはありません。サードパーティが使用するライブラリがあるため、広く知られており使用されているクエリ言語を提供する必要があります。
David Thielen

1
確かに、jsel-github.com/dragonworx/ jselを使用できdataます。JSONオブジェクトを含む変数があれば、次のように記述します。jsel(data).select("//*[@id=3]")これにより、idキーが3のオブジェクトが返されます
Ali

回答:


122

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

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


3
ブライアンの答えは、dojo では jsonPathモジュールの代わりにjsonQueryモジュールを使用する必要があることを示唆しています。
hugomg 2011

5
これはどれくらいしっかりしていますか?そして、私たちにとって取引キラーであるJavaまたはC#バージョンを見つけることができません。
David Thielen

2
ここにリンクされているサイトは、JavascriptとPHPを提供しています。Java実装が必要な場合は、code.google.com
Matthias Rongeの

2
JSONPathはXPathの正式なセマンティクスに基づいていないことに言及する必要があります。JSONiqの方が適している場合があります。
wcandillon 2013年

1
@Paramaeleonそれは素晴らしい作品です。ちなみに、プロジェクトはGitHub移行されています。人々はこれについてコメントし続けるので、マイクは答えにこれを追加したいと思うかもしれません。
フランクリンユー

21

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

Dojoのドキュメントから:

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

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


4
github JSONQueryリンクが機能していないようです。JSONSelectにもJavaScriptバージョンがあります。
Henrik AastedSørensen2012

19

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

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

HTH。


3
現在、JSONiq実装があります。Zorba2.6が正式にサポートしています。
Ghislain Fourny 2012

注:MarkLogicは、バージョン8の時点でJSONをネイティブに格納し、XPathを直接適用できるようにします。
grtjn

18

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

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


CSSセレクターまたはXPathのいずれかにあるインスピレーションに言及しているため、すばらしい要約と例も示しています。
Jochem Schulenklopper

13

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

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

XMLのXPathのようなJSONのJSPath。

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


9

XQueryは、プロセッサがJSONサポートを提供している場合、JSONのクエリに使用できます。これは、BaseXを使用して "id" = 1のオブジェクトを検索する簡単な例です。

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

(6年後)Saxonは、JSONをクエリするXQuery 3.1を実行します。私のSaxonの経験は、javaによって実行されるjarファイルを使用しています。saxon-javaという名前のノードモジュールがありますが、jsonでどのように機能するかはわかりません。そして、Saxon-JSと呼ばれるSaxonicaからの別の新しいものがあります。
チャールズロス

9

なんらかのクエリ言語はありますか...

jqは、JSONPathによく似たJ SON q uery言語を定義します -https : //github.com/stedolan/jq/wiki/For-JSONPath-usersを参照してください

... [どれ] [0] .objectsでid = 3のアイテムを見つけるために使用できますか

これが意味することを仮定します。オブジェクトがどこにあっても、ID == 3の指定されたキーの下にあるすべてのJSONオブジェクトを検索します。対応するjqクエリは次のようになります。

.[0].objects | .. | objects | select(.id==3)

ここで「|」はパイプオペレーター(コマンドシェルパイプの場合と同様)であり、セグメント ".. | objects"は "オブジェクトがどこにあってもかまわない"に対応します。

jqの基本は大部分が明白で直感的であるか、少なくとも非常に単純です。残りのほとんどは、コマンドシェルパイプに慣れていれば簡単に習得できます。jq FAQには、チュートリアルなどへのポインタがあります。

jqプロセッサはCRUD操作をサポートするという点でもjqはSQLに似ていますが、jqプロセッサが入力を上書きすることはありません。jqはJSONエンティティのストリームも処理できます。

JSON指向のクエリ言語を評価する際に考慮したいその他の2つの基準は次のとおりです。

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

8

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

残念ながら、現時点ではnpmで公開されておらず、手動でのインストールが必要です...
Andrew Mao


7

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

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

data問題のJSONを含む変数が呼び出された場合、jselを使用して次のように記述できます。

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

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


6

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

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

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


私はWebサイトの最初の例が好きで、ObjectPathを対話的なシェルのようなモードで実行できるのは素晴らしいことですが、私が探しているのは、PythonスクリプトでObjectPathを使用することです。ObjectPathをライブラリとして使用する方法を示す例を教えてもらえますか?そのようなものがウェブサイトで見つかりません。
piokuc 2014年

githubでの Pythonの使用に関するセクションを参照してください。これをウェブサイトに追加します-現時点では実際に見つけるのは困難です。さらにサポートが必要な場合は、googleグループに質問を投稿できます。
Ela Bednarek 2014年

Elaさん、ありがとうございます。githubページに追加された例はまさに必要なものです。
piokuc 2014年

4

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

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

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

defiant.jsのソースコードは、https
//github.com/hbi99/defiant.jsにあります。


3

JMESPathは最近(2020年現在)非常に人気があるようで、JSONPathに関する多くの問題に対処しています。多くの言語で利用できます。


1

私と同じように、パスベースの検索を実行したいが、実際のXPathは気にしない場合は、lodash _.get()が機能します。lodash docsの例:

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'

残念ながら、その関数は単一の結果しか返すことができません。一致する項目の配列のフェッチはサポートされていません。これが他のライブラリが優れている場所です。
Simon East

0

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

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


1
この質問にはjavascriptのタグが付けられていますが、このライブラリはJava
tripleee '

Javascriptバージョンもあります-github.com/satyapaul/jpath/blob/master/jpath.jsこれが彼のプロジェクトのgitホームページです-github.com/satyapaul/jpath
Satyajit Paul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.