Отфильтруйте вложенные данные json, используя jsonpath, как в примере

Я использую 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')]");

Хорошо. Так в чем твой вопрос? Это сайт вопросов/ответов.

CryptoFool 11.12.2020 13:21

Я хочу отфильтровать содержимое, как объяснено. Я ищу строку «jsonpath», которая может помочь мне это получить. Приведенная выше строка jsonpath не выполняет эту работу. Я только что перечислил, что с использованием аналогичного синтаксиса, используемого jsonpath

user578219 11.12.2020 13:29

Укажите, что вы ищете, в форме вопроса, например... «какая строка jsonpath даст мне полную запись ОС только для той ОС, которая ей соответствует», или что-то в этом роде. Я думаю, вы также должны показать нам свой код Python. Если я правильно понимаю, jsonstring сама по себе ничего вам не "дает"? Вы должны передать эту строку в функцию Java, чтобы использовать ее, верно? Вы должны показать нам, какое поведение вы в настоящее время получаете от своего кода.

CryptoFool 11.12.2020 13:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
4 991
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить внешний массив, вам нужно использовать фильтр, например $[?(...)]

Для вашего текущего варианта использования нам нужно использовать вложенные фильтры массива. В 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"}]}

работает как шарм. Я понял, что фильтр должен быть похож на $[?(...)] , но строка, которую я имел, требует гораздо больше работы, чтобы иметь возможность достичь того, что вы предложили. Спасибо за все информационные ссылки.

user578219 11.12.2020 16:44

Другие вопросы по теме