jqを使用してJSONデータを解析すると、「Title」文字列で配列をインデックスできませんでしたというエラーメッセージが表示されます。

jqを使用してJSONデータを解析すると、「Title」文字列で配列をインデックスできませんでしたというエラーメッセージが表示されます。
{
    "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"
                }
                ]
            }
        ]
}
]
}

以下を試しましたが、エラーが発生します。

文字列 'Title'を使用して配列にインデックスを付けることはできません。

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

他の部分と同じ行で試しましたが、同じエラーが発生しました。

この問題をどのように解決できますか?

予想出力:

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

ベストアンサー1

Cannot index array with string "Title"あなたはこのコマンドを受け取りません。

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

これは、配列のオブジェクトにまたはキーがないためですcharacteristics(子配列のキーです)。valuecontents.details.Temperature

コマンド会議あなたに送信するメッセージは次のとおりです。

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

または

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

キールックアップが見つからない場合、contentまたは配列要素の取得に失敗した場合、contentオブジェクト自体ではなくオブジェクトを含む配列が作成されます。そして、文字列では配列にインデックスを付けることはできません。


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"

これは<object(s)> as <variable>ループのように動作するので、jqここで何が起こるのかは、$t各要素が順番に割り当てられ、.details.Temperature[]各要素に対して新しい配列が構成されることです。渡された配列は@csvCSV形式で行を出力します。

jqCSV出力では、フィールドは常に二重引用符で囲まれています。取り除くために不要引用符:

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

csvformatの一部ですcsvkit)

あるいは、タブ区切りの出力を取得する@tsvために代わりにinを使用することもできます。@csv

おすすめ記事