web-dev-qa-db-ja.com

JSONPathの文字列でフィルタリングする方法は?

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」を使用する必要があることを示唆していますが、それでも機能しません。ここで何が間違っていますか?

48
Alastair

クエリは正常に見え、データとクエリは 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タイトルのリストを返します。

28
pb2q

引用符を削除します。

List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");

こちらもご覧ください Json Path Example page

5
durandal

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"
    } ]
  } ]
}
4
Joe Meree

''最後に、このライブラリとツールを使用できます。 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
0
Hakan Bilgin

ブラウザの便利なツールをテストするのは少々欺くかもしれません。考慮してください:

{
  "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を返しました。ブラウザのテストツールに依存するのではなく、検証する単純な単体テストを作成することをお勧めします。

0
Jeremy Deane