Message d'erreur «Impossible d'indexer le tableau avec la chaîne« Titre »» lors de l'analyse des données JSON avec 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"
                }
                ]
            }
        ]
}
]
}

J'ai essayé l'approche ci-dessous, mais j'obtiens l'erreur

Impossible d'indexer le tableau avec la chaîne "Title"

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

J'essayais sur la même ligne avec d'autres sections, mais j'obtenais la même erreur.

Comment résoudre ce problème?

Production attendue:

abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low
sam
la source

Réponses:

12

Vous n'obtenez pas Cannot index array with string "Title"avec cette commande, vous obtenez

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

car il n'y a pas characteristicsou valueclé dans les objets du contentstableau (ils sont clés dans la .details.Temperaturesous-tableau).

La commande qui vous aurait donné ce message est:

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

ou

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

Le fait de manquer la contentrecherche de clé ou de ne pas obtenir les éléments du contenttableau génère un tableau d'un objet plutôt que de l'objet lui-même. Et vous ne pouvez pas indexer un tableau avec une chaîne.


En supposant que vous souhaitiez une sortie 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"

Le <object(s)> as <variable>agit comme une boucle jq, donc ce qui se passe ici est que $tchaque élément sera affecté .details.Temperature[]à son tour, et pour chaque élément, un nouveau tableau est construit. Le tableau est transmis, @csvce qui produira des lignes au format CSV.

jqcite toujours les champs de sa sortie CSV. Pour se débarrasser des citations inutiles :

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

( csvformatfait partie de csvkit)

Ou, vous pouvez utiliser @tsvà la place de @csvpour obtenir une sortie délimitée par des tabulations à la place.

Kusalananda
la source
2
Kusal Merci pour vos contributions. J'utilise la chose ci-dessus avec la boucle for. détails ci-dessous. pour le domaine des certifications de température; faire echo $ field :: jq --arg champ "$ field" -r '.content [] | .details. "$ field" [] as $ t | [.Title, .brand, $ t.value, $ t.characteristics] | @csv 'file.json terminé. mais en obtenant "jq: error: try. [" field "] au lieu de .field pour les champs au nom inhabituel à <top-level>, ligne 1:"
sam
J'ai obtenu ceci, je n'ai pas pu corréler et je mettais .details. $ [Champ] ou .details. "$ Field". Maintenant, je l'ai changé en .details [$ field] [] et ça fonctionne bien maintenant.
sam
1
@sam Désolé, j'étais ailleurs. Oui, .details[$field][]ou .["details"][$field][]la syntaxe est-elle correcte.
Kusalananda
J'ai voté positivement et je vous remercie de votre soutien.
sam
Kusal, désolé de t'avoir dérangé à nouveau. Est-il possible d'obtenir les valeurs principales du contenu sans donner le nom des champs. Valeurs "Titre", "marque", "taille", "date". quelque chose comme jq -r .content [] | et cela me donne toutes les valeurs principales mentionnées ci-dessus.
sam