Как фильтровать по строке в JSONPath?
У меня есть ответ JSON от Facebook API, который выглядит следующим образом:
{
"data": [
{
"name": "Barack Obama",
"category": "Politician",
"id": "6815841748"
},
{
"name": "Barack Obama's Dead Fly",
"category": "Public figure",
"id": "92943557739"
}]
}
Я хочу применить к нему JSONPath, чтобы возвращать результаты только с категорией "Политик". Из того, что я прочитал, видно, что мне нужно сделать:
$.data[?(@.category=='Politician')]
но согласно инструменту тестирования, который я нашел, это не работает. Я нашел другой вопрос, который предполагает, что я должен использовать "eq" вместо "==", но это тоже не работает. Что я тут не так делаю?
5 ответов
Ваш запрос выглядит хорошо, и ваши данные и запрос работают для меня, используя этот анализатор 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
, инструмент возвращает список всех заголовков.
Я не нашел правильный синтаксис фильтра 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"
} ]
} ]
}
Бросьте цитаты:
List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");
Смотрите также эту страницу JSON Path Example
Инструменты тестирования браузера, хотя и удобные, могут быть немного обманчивы. Рассматривать:
{
"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"
}
}
Большинство инструментов вернули это как ложное:
$[?(@.class==inpatient)]
Но когда я казнил против
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>1.2.0</version>
</dependency>
Вернулось правда. Я рекомендую написать простой модульный тест для проверки, а не полагаться на инструменты тестирования браузера.
"Аластер, ты можешь использовать эту библиотеку и инструмент; 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