Messaggio di errore "Impossibile indicizzare l'array con la stringa" Title "" durante l'analisi dei dati JSON con jq


9
{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "characteristics":"Normal"
            },
            {
                "value":"100",
                "characteristics":"high"
            },

            {
                "value":"80",
                "characteristics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "characteristics":"pass"
            },

            {
                "value": "50",
                "characteristics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

Ho provato l'approccio seguente, ma ho riscontrato l'errore

Impossibile indicizzare l'array con la stringa "Title"

jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.

Stavo provando sulla stessa linea con altre sezioni, ma ottenevo lo stesso errore.

Come posso risolvere questo problema?

Uscita prevista:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low

Risposte:


12

Non stai ottenendo Cannot index array with string "Title"con quel comando, stai ottenendo

[
  "abc",
  "xyz",
  null,
  null
]

poiché non vi è alcuna chiave characteristicso valuenegli oggetti contentsdell'array (sono chiavi .details.Temperaturedell'array secondario).

Il comando che ti avrebbe dato quel messaggio è:

jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"

o

jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"

Perdere la contentricerca della chiave o non riuscire a ottenere gli elementi contentdell'array produce un array di un oggetto anziché l'oggetto stesso. E non puoi indicizzare un array con una stringa.


Supponendo che si desideri un output CSV:

$ jq -r '.content[] | .details.Temperature[] as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
"abc","xyz","90","Normal"
"abc","xyz","100","high"
"abc","xyz","80","low"

Si <object(s)> as <variable>comporta come un loop in jq, quindi ciò che accade qui è che $tverrà assegnato ogni elemento .details.Temperature[]a sua volta, e per ogni elemento, viene costruito un nuovo array. Viene passato l'array @csvche genererà righe in formato CSV.

jqvirgolerà sempre due volte i campi del suo output CSV. Per sbarazzarsi di citazioni non necessarie :

jq -r '...as above...' file.json | csvformat

( csvformatfa parte di csvkit)

In alternativa, è possibile utilizzare @tsvinvece di @csvottenere output delimitato da tabulazioni.


2
Kusal Grazie per i tuoi contributi. Sto usando la cosa sopra con for loop. dettagli sotto. per campo in Certificazioni di temperatura; do echo $ field :: jq --arg campo "$ field" -r '.content [] | .details. "$ field" [] come $ t | [.Titolo, .brand, $ t.value, $ t.caratteristiche] | @csv 'file.json fatto. ma ottenere "jq: errore: provare. [" campo "] invece di .field per i campi con nome insolito a <top-level>, riga 1:"
sam

Ho ottenuto questo, non ero in grado di correlare e stavo inserendo .details. $ [Field] o .details. "$ Field". Ora l'ho cambiato in .details [$ field] [] e ora funziona bene.
sam

1
@sam Siamo spiacenti, ero altrove. Sì, .details[$field][]o .["details"][$field][]è la sintassi corretta.
Kusalananda

Ho votato positivamente e grazie per il tuo supporto.
Sam

Kusal, scusa se ti disturbo di nuovo. È possibile ottenere i valori principali del contenuto senza fornire il nome dei campi. Valori "Titolo", "marca", "dimensione", "data". qualcosa come jq -r .content [] | e mi dà tutti i valori principali di cui sopra.
sam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.