Obtenga el elemento raíz usando jsonpath según la condición de los subelementos

Aug 18 2020

Estoy trabajando con la biblioteca Jayway JsonPath para obtener la 'identificación' correcta desde debajo de JSON donde mi phoneNumberstipo es 'iPhone'.

En general, me gustaría saber cómo encontrar algo del elemento raíz de un bloque cuando se especifica una condición específica en los objetos sub-JSON.

Intenté las siguientes expresiones que seleccionan el bloque asociado con el tipo de iPhone y también una lista de identificadores respectivamente, pero no puedo llegar al elemento raíz que idpertenece al objeto JSON donde mi tipo de teléfono es iPhone. ¿Alguien puede guiarme? Necesito obtener el idas 1 para esta pregunta.

Para obtener la lista de identificadores: $[*].id

Para obtener el objeto json correspondiente al 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"
            }
        ]
    }
]

Respuestas

gregsdennis Oct 06 2020 at 03:16

Creo que quieres que tu expresión se vea más profunda.

Primero, busque los objetos que tienen un iPhone en la lista de números de teléfono. Luego, simplemente seleccione las ID.

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


Editar

Parece que la biblioteca Java JsonPath (creo que estás usando esto) admite una serie de funciones. No enumera a contains(), pero puede probar el anyofoperador:

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

Tenga en cuenta que esto definitivamente es específico de la implementación y es probable que no funcione con ninguna otra biblioteca.