Я использую jsonpath для фильтрации.
Json (пустой json просто для объяснения) исходная строка, которая в основном представляет собой список операционных систем и сведений о ее программах и т. д. В этом примере ОС, чей идентификатор = 1403, является ОС Windows 10 и имеет 2 функции, а также браузер. Есть более подробная информация о функции браузера, как показано в json.
[
{
"id": 1403,
"os": "window 10",
"features": [
{
"id": 1356,
"name": "architecture",
"value": [
{
"id": 1308,
"feature": [
{
"id": 1262,
"key": "name",
"value": "amd64"
}
]
}
],
"category": "cat1"
},
{
"id": 1357,
"name": "browser",
"value": [
{
"id": 1309,
"feature": [
{
"id": 1263,
"key": "name",
"value": "Firefox"
},
{
"id": 1265,
"key": "version",
"value": "187"
}
]
}
],
"category": "cat2"
}
]
},
{
"id": 2804,
"os": "window 7",
"features": [
{
"id": 2764,
"name": "architecture",
"value": [
{
"id": 2719,
"feature": [
{
"id": 2679,
"key": "name",
"value": "amd64"
}
]
}
],
"category": "cat1"
},
{
"id": 2765,
"name": "browser",
"value": [
{
"id": 2722,
"feature": [
{
"id": 2685,
"key": "name",
"value": "Chrome"
},
{
"id": 2684,
"key": "version",
"value": "87.0.4280.88"
}
]
}
],
"category": "cat2"
}
]
}
]
Я хочу иметь возможность фильтровать json таким образом, чтобы
features[*].name == 'browser' and features[*].value[*].feature[*].value == 'chrome'
Какой будет строка JsonPath, которая поможет мне выполнить вышеуказанный запрос? В приведенном выше запросе используется аналогичный синтаксис, используемый строкой JsonPath, но он не выполняет эту работу. Это просто объяснить.
Есть еще один пример здесь получает название фильма с учетом поля «В ролях»
И хотелось бы получить полный json ОС, удовлетворяющий этому условию. В этом случае массив ОС, который содержит только одну ОС, т.е. с id= 2804
[
{
"id": "2804",
...
}
]
Я застрял намного перед тем, какую цель достичь. Вот мой код, чтобы получить все ОС, у которых есть «имя = браузер». Я получаю массив, но он содержит только элементы value[]. Я хочу, чтобы он получил полный json. Он возвращает объект с идентификаторами 1357, 2765.
List<Map<String, Object>> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[*].features[*].[?(@.name == 'browser')]");
Я хочу отфильтровать содержимое, как объяснено. Я ищу строку «jsonpath», которая может помочь мне это получить. Приведенная выше строка jsonpath не выполняет эту работу. Я только что перечислил, что с использованием аналогичного синтаксиса, используемого jsonpath
Укажите, что вы ищете, в форме вопроса, например... «какая строка jsonpath даст мне полную запись ОС только для той ОС, которая ей соответствует», или что-то в этом роде. Я думаю, вы также должны показать нам свой код Python. Если я правильно понимаю, jsonstring сама по себе ничего вам не "дает"? Вы должны передать эту строку в функцию Java, чтобы использовать ее, верно? Вы должны показать нам, какое поведение вы в настоящее время получаете от своего кода.
Чтобы получить внешний массив, вам нужно использовать фильтр, например $[?(...)]
Для вашего текущего варианта использования нам нужно использовать вложенные фильтры массива. В JsonPath есть открытая проблема для фильтра на дочернем уровне. (См. здесь).
К счастью, есть обходной путь, который предлагается использовать contains
вместо здесь.
мы можем использовать приведенное ниже выражение для фильтрации:
List<Object> expensive = JsonPath.parse(jsonDataSourceString)
.read("$[?(@.features[?(@.name == 'browser')].value[*].feature[*].value contains 'Chrome')]");
Печатает приведенный ниже вывод
{id=2804, os=window 7, features=[{"id":2764,"name":"architecture","value":[{"id":2719,"feature":[{"id":2679,"key":"name","value":"amd64"}]}],"category":"cat1"},{"id":2765,"name":"browser","value":[{"id":2722,"feature":[{"id":2685,"key":"name","value":"Chrome"},{"id":2684,"key":"version","value":"87.0.4280.88"}]}],"category":"cat2"}]}
работает как шарм. Я понял, что фильтр должен быть похож на $[?(...)] , но строка, которую я имел, требует гораздо больше работы, чтобы иметь возможность достичь того, что вы предложили. Спасибо за все информационные ссылки.
Хорошо. Так в чем твой вопрос? Это сайт вопросов/ответов.