Obtenha o elemento raiz usando jsonpath com base na condição dos subelementos

Aug 18 2020

Estou trabalhando com a biblioteca Jayway JsonPath para obter o 'id' correto abaixo do JSON, onde meu phoneNumberstipo é 'iPhone'.

Em geral, gostaria de saber como encontrar algo no elemento raiz de um bloco quando uma condição específica é especificada nos objetos sub-JSON.

Tentei as expressões abaixo que selecionam o bloco associado ao tipo de iPhone e também uma lista de ids respectivamente, mas não consigo chegar ao elemento raiz idpertencente ao objeto JSON onde meu tipo de telefone é iPhone. Alguém pode me orientar? Preciso obter o idcomo 1 para esta pergunta.

Para obter a lista de ids: $[*].id

Para obter o objeto json correspondente ao tipo de 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"
            }
        ]
    }
]

Respostas

gregsdennis Oct 06 2020 at 03:16

Acho que você quer que sua expressão seja mais profunda.

Primeiro, encontre os objetos que têm um iPhone na lista de números de telefone. Em seguida, basta selecionar os IDs.

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


Editar

Parece que a biblioteca Java JsonPath (acho que você está usando isso) oferece suporte a várias funções. Ele não lista um contains(), mas você pode tentar o anyofoperador:

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

Observe que isso é definitivamente específico da implementação e provavelmente não funcionará com nenhuma outra biblioteca.