Fehlermeldung "Array mit Zeichenfolge 'Titel' kann nicht indiziert werden" beim Parsen von JSON-Daten mit 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"
                }
                ]
            }
        ]
}
]
}

Ich habe den folgenden Ansatz versucht, aber den Fehler erhalten

Array mit Zeichenfolge "Titel" kann nicht indiziert werden

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

Ich habe versucht, mit anderen Abschnitten in derselben Zeile zu arbeiten, aber den gleichen Fehler erhalten.

Wie löse ich dieses Problem?

Erwartete Ausgabe:

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

Antworten:

12

Sie bekommen nicht Cannot index array with string "Title"mit diesem Befehl, Sie bekommen

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

da die Objekte des Arrays keinen characteristicsoder valueSchlüssel enthalten contents(sie sind Schlüssel im .details.TemperatureUnterarray).

Der Befehl, würden Sie gegeben haben , diese Nachricht ist:

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

oder

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

Wenn Sie die contentSchlüsselsuche verpassen oder die Elemente des contentArrays nicht abrufen, erhalten Sie ein Array mit einem Objekt und nicht mit dem Objekt selbst. Und Sie können ein Array nicht mit einer Zeichenfolge indizieren.


Angenommen, Sie möchten eine CSV-Ausgabe:

$ 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"

Das <object(s)> as <variable>verhält sich wie eine Schleife. jqWas also hier passiert, ist, dass $tjedem Element der .details.Temperature[]Reihe nach zugewiesen wird und für jedes Element ein neues Array erstellt wird. Das Array wird durchlaufen, @csvdas CSV-formatierte Zeilen ausgibt.

jqwird die Felder seiner CSV-Ausgabe immer doppelt in Anführungszeichen setzen. So entfernen Sie unnötige Zitate:

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

( csvformatist ein Teil von csvkit)

Oder möchten Sie verwenden @tsvanstelle von @csvTabulatoren getrennte Ausgabe statt zu bekommen.

Kusalananda
quelle
2
Kusal Vielen Dank für Ihre Beiträge. Ich benutze oben mit for loop. Details unten. für Feld in Temperaturzertifizierungen; echo $ field :: jq --arg Feld "$ field" -r '.content [] | .details. "$ field" [] als $ t | [.Titel, .marke, $ t.Wert, $ t.Zeichen] | @csv 'file.json fertig. aber "jq: error: try. [" field "] anstelle von .field für ungewöhnlich benannte Felder auf <top-level>, Zeile 1:"
sam
Ich habe das verstanden, konnte nicht korrelieren und habe .details. $ [Field] oder .details. "$ Field" gesetzt. Jetzt habe ich das in .details [$ field] [] geändert und es funktioniert jetzt einwandfrei.
Sam
1
@sam Sorry, ich war woanders. Ja, .details[$field][]oder .["details"][$field][]ist die richtige Syntax.
Kusalananda
Ich habe abgestimmt und danke Ihnen für Ihre Unterstützung.
Sam
Kusal, tut mir leid, dass ich dich wieder gestört habe. Ist es möglich, die Hauptwerte des Inhalts abzurufen, ohne den Namen der Felder anzugeben. Werte für "Titel", "Marke", "Größe", "Datum". so etwas wie jq -r .content [] | und es gibt mir alle Hauptwerte wie oben erwähnt.
Sam