Получить корневой элемент с помощью jsonpath на основе условия подэлементов

Aug 18 2020

Я работаю с библиотекой Jayway JsonPath, чтобы получить правильный «идентификатор» снизу JSON, где мой phoneNumbersтип - «iPhone».

В общем, я хотел бы знать, как найти что-то в корневом элементе блока, когда в суб-объектах JSON указано конкретное условие.

Я пробовал следующие выражения, которые выбирают блок, связанный с типом iPhone, а также список идентификаторов соответственно, но я не могу добраться до корневого элемента, idпринадлежащего объекту JSON, где мой тип телефона - iPhone. Кто-нибудь может помочь мне? Мне нужно получить id1 для этого вопроса.

Чтобы получить список идентификаторов: $[*].id

Чтобы получить объект json, соответствующий типу iPhone: $[*].phoneNumbers[?(@.type=='iPhone')]

[
    {
        "id": "1",
        "phoneNumbers": [
            {
                "type": "iPhone",
                "number": "0123-4567-8888"
            },
            {
                "type": "home",
                "number": "0123-4567-8910"
            }
        ]
    },
    {
        "id": "2",
        "phoneNumbers": [
            {
                "type": "x",
                "number": "0123-4567-8888"
            },
            {
                "type": "y",
                "number": "0123-4567-8910"
            }
        ]
    }
]

Ответы

gregsdennis Oct 06 2020 at 03:16

Я думаю, вы хотите, чтобы ваше выражение лица выглядело глубже.

Сначала найдите в списке телефонных номеров объекты, у которых есть iPhone. Затем просто выберите идентификаторы.

Попробуй $[?(@.phoneNumbers[*].type=="iPhone")].id.


Редактировать

Похоже, что библиотека Java JsonPath (я думаю, вы ее используете) поддерживает ряд функций. Он не перечисляет a contains(), но вы можете попробовать anyofоператор:

$[?(@.phoneNumbers[*].type anyof ["iPhone"])].id

Обратите внимание, что это определенно зависит от реализации и, скорее всего, не будет работать с какой-либо другой библиотекой.