jqでJSONデータを解析すると、エラーメッセージ「文字列 'Title'の配列にインデックスを付けることができません」


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"
                }
                ]
            }
        ]
}
]
}

以下のアプローチを試しましたが、エラーが発生します

文字列「Title」の配列にインデックスを付けることはできません

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

他のセクションと同じ行で試しましたが、同じエラーが発生しました。

この問題を解決するにはどうすればよいですか?

期待される出力:

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

回答:


12

あなたはCannot index array with string "Title"そのコマンドで得ていません、あなたは得ています

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

配列のオブジェクトにはキーcharacteristicsまたはvalueキーがないためですcontents(それらは.details.Temperatureサブ配列のキーです)。

そのメッセージを表示するコマンドは次のとおりです。

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

または

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

contentキールックアップを逃したり、content配列の要素の取得に失敗したりすると、オブジェクト自体ではなく、1つのオブジェクトの配列が生成されます。また、文字列で配列にインデックスを付けることはできません。


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代わりに@csvを使用して、タブ区切りの出力を取得することもできます。


2
クサルご協力ありがとうございます。上記のものをforループで使用しています。詳細は以下。温度認証のフィールド用。エコー$フィールド:: jq --argフィールド "$フィールド" -r '.content [] | .details。 "$ field" [] as $ t | [.Title、.brand、$ t.value、$ t.characteristics] | @csv 'file.jsonが完了しました。ただし、「jq:error:try。["field"]を.fieldの代わりに<top-level>の異常な名前のフィールド、1行目」で取得
sam

これを取得しましたが、相互に関連付けることができず、.details。$ [field]または.details。 "$ field"を配置していました。これを.details [$ field] []に変更しましたが、現在は問題なく動作しています。
sam

1
@sam申し訳ありませんが、私は別の場所にいました。はい、.details[$field][]または.["details"][$field][]正しい構文です。
クサラナンダ

私は賛成票を投じました、そしてあなたのサポートに感謝します。
sam

Kusal、またお邪魔して申し訳ありません。フィールド名を指定せずにコンテンツのメイン値を取得することは可能ですか?「タイトル」、「ブランド」、「サイズ」、「日付」の値。jq -r .content []のようなもの| そして、それは私に上記のようにすべての主要な価値を与えます。
sam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.