Obtenir l'élément racine à l'aide de jsonpath en fonction de la condition des sous-éléments

Aug 18 2020

Je travaille avec la bibliothèque Jayway JsonPath pour obtenir le bon «id» sous JSON où mon phoneNumberstype est «iPhone».

En général, j'aimerais savoir comment trouver quelque chose à partir de l'élément racine d'un bloc lorsqu'une condition spécifique est spécifiée dans les objets sous-JSON.

J'ai essayé les expressions ci-dessous qui sélectionnent le bloc associé au type d'iPhone et également une liste d'identifiants respectivement, mais je ne suis pas en mesure d'accéder à l'élément racine idappartenant à l'objet JSON où mon type de téléphone est iPhone. Quelqu'un peut-il me guider s'il vous plaît? J'ai besoin d'obtenir le id1 pour cette question.

Pour obtenir la liste des identifiants: $[*].id

Pour obtenir l'objet json correspondant au type d'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"
            }
        ]
    }
]

Réponses

gregsdennis Oct 06 2020 at 03:16

Je pense que vous voulez que votre expression soit plus profonde.

Tout d'abord, recherchez les objets qui ont un iPhone dans la liste des numéros de téléphone. Ensuite, sélectionnez simplement les ID.

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


Éditer

Il semble que la bibliothèque Java JsonPath (je pense que vous l'utilisez) prend en charge un certain nombre de fonctions. Il ne répertorie pas a contains(), mais vous pouvez essayer l' anyofopérateur:

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

Notez que ceci est certainement spécifique à l'implémentation et ne fonctionnera probablement pas avec une autre bibliothèque.