Facebook APIから次のようなJSON応答があります。
{
"data": [
{
"name": "Barack Obama",
"category": "Politician",
"id": "6815841748"
},
{
"name": "Barack Obama's Dead Fly",
"category": "Public figure",
"id": "92943557739"
}]
}
JSONPathを適用して、カテゴリが「政治家」の結果のみを返すようにします。私が読んだことから、私がする必要があるようです:
$.data[?(@.category=='Politician')]
テストツール によると、これは機能しません。 別の質問 を見つけました。これは、「==」の代わりに「eq」を使用する必要があることを示唆していますが、それでも機能しません。ここで何が間違っていますか?
クエリは正常に見え、データとクエリは this JsonPath parserを使用して機能します。述語の例については、そのページのクエリ例をご覧ください。
使用しているテストツールに問題があるようです。 JsonPath site の例でも、誤った結果が返されています。
例えば、与えられた:
_{
"store":
{
"book":
[
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle":
{
"color": "red",
"price": 19.95
}
}
}
_
そして式:$.store.book[?(@.length-1)].title
、ツールはallタイトルのリストを返します。
引用符を削除します。
List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");
こちらもご覧ください Json Path Example page
Jsonの名前と値のペアから値を抽出するための正しいjsonpathフィルター構文が見つかりませんでした。
以下に、構文と簡略化されたサンプルTwitterドキュメントを示します。
このサイト はテストに役立ちました:
Jsonpathフィルター式:
.events[0].attributes[?(@.name=='screen_name')].value
テスト文書:
{
"title" : "test Twitter",
"priority" : 5,
"events" : [ {
"eventId" : "150d3939-1bc4-4bcb-8f88-6153053a2c3e",
"eventDate" : "2015-03-27T09:07:48-0500",
"publisher" : "Twitter",
"type" : "Tweet",
"attributes" : [ {
"name" : "filter_level",
"value" : "low"
}, {
"name" : "screen_name",
"value" : "_ziadin"
}, {
"name" : "followers_count",
"value" : "406"
} ]
} ]
}
''最後に、このライブラリとツールを使用できます。 DefiantJS。 JSON構造でXPathクエリを有効にし、このXPathをテストおよび検証できます。
//data[category="Politician"]
DefiantJSは、メソッド "search"を使用してグローバルオブジェクトを拡張します。このメソッドは、一致する配列を返します。 Javascriptでは、次のようになります。
var person = JSON.search(json_data, "//people[category='Politician']");
console.log( person[0].name );
// Barack Obama
ブラウザの便利なツールをテストするのは少々欺くかもしれません。考慮してください:
{
"resourceType": "Encounter",
"id": "EMR56788",
"text": {
"status": "generated",
"div": "Patient admitted with chest pains</div>"
},
"status": "in-progress",
"class": "inpatient",
"patient": {
"reference": "Patient/P12345",
"display": "Roy Batty"
}
}
ほとんどのツールはこれをfalseとして返しました。
$[?(@.class==inpatient)]
しかし、私がに対して実行したとき
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>1.2.0</version>
</dependency>
Trueを返しました。ブラウザのテストツールに依存するのではなく、検証する単純な単体テストを作成することをお勧めします。