Ottieni l'elemento root utilizzando jsonpath in base alla condizione dei sottoelementi

Aug 18 2020

Sto lavorando con la libreria Jayway JsonPath per ottenere l''id 'corretto da sotto JSON, dove il mio phoneNumberstipo è' iPhone '.

In generale, vorrei sapere come trovare qualcosa dall'elemento radice di un blocco quando una condizione specifica è specificata negli oggetti sub-JSON.

Ho provato di seguito espressioni che selezionano rispettivamente il blocco associato al tipo di iPhone e anche un elenco di ID, ma non sono in grado di accedere all'elemento radice idappartenente all'oggetto JSON in cui il mio tipo di telefono è iPhone. Qualcuno può guidarmi per favore? Devo ottenere l' idAS 1 per questa domanda.

Per ottenere l'elenco degli ID: $[*].id

Per ottenere l'oggetto json corrispondente al tipo di 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"
            }
        ]
    }
]

Risposte

gregsdennis Oct 06 2020 at 03:16

Penso che tu voglia che la tua espressione sia più profonda.

Per prima cosa, trova gli oggetti che hanno un iPhone nell'elenco dei numeri di telefono. Quindi seleziona gli ID.

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


modificare

Sembra che la libreria Java JsonPath (penso che tu lo stia usando) supporti una serie di funzioni. Non elenca una contains(), ma potresti provare l' anyofoperatore:

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

Nota che questo è decisamente specifico dell'implementazione e probabilmente non funzionerà con nessun'altra libreria.