Подтвердить что ты не робот

Как фильтровать по строке в JSONPath?

У меня есть ответ JSON от API Facebook, который выглядит так:

{
  "data": [
     {
       "name": "Barack Obama", 
       "category": "Politician", 
       "id": "6815841748"
     }, 
     {
       "name": "Barack Obama Dead Fly", 
       "category": "Public figure", 
       "id": "92943557739"
     }]
 }

Я хочу применить JSONPath к нему, чтобы возвращать результаты только с категорией "Политик". Из того, что я прочитал, кажется, что мне нужно сделать:

$.data[?(@.category=='Politician')]

но в соответствии с инструментом тестирования, я обнаружил, что это не работает. Я нашел еще один вопрос, который предполагает, что я должен использовать "eq" вместо "==", но это тоже не работает. Что я здесь не так понял?

4b9b3361

Ответ 1

Ваш запрос выглядит отлично, и ваши данные и запрос работают для меня с помощью этого парсера JsonPath. Также см. Примеры запросов на этой странице для более предикатных примеров.

Инструмент тестирования, который вы используете, кажется ошибочным. Даже примеры из сайта JsonPath возвращают неверные результаты:

например:

{
    "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, инструмент возвращает список всех названий.

Ответ 3

Я не нашел правильный синтаксис фильтра jsonpath для извлечения значения из пары имя-значение в json.

Ниже приведен синтаксис и сокращенный пример твиттера ниже.

Этот сайт был полезен для тестирования:

Выражение фильтра 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

'' Alastair, вы можете использовать эту библиотеку и инструмент; DefiantJS. Он позволяет запросы XPath в структурах JSON, и вы можете проверить и проверить этот XPath:

//data[category="Politician"]

DefiantJS расширяет глобальный объект с помощью метода "поиск", который, в свою очередь, возвращает массив со спичками. В Javascript это будет выглядеть так:

var person = JSON.search(json_data, "//people[category='Politician']");
console.log( person[0].name );
// Barack Obama

Ответ 5

Инструменты тестирования браузера, в то время как удобно, могут быть немного обманывающими. Рассмотрим:

{
  "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>

Это вернулось. Я рекомендую написать простой unit test, чтобы проверить, а не полагаться на инструменты тестирования браузера.