{
"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
(子配列のキーです)。value
contents
.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[]
各要素に対して新しい配列が構成されることです。渡された配列は@csv
CSV形式で行を出力します。
jq
CSV出力では、フィールドは常に二重引用符で囲まれています。取り除くために不要引用符:
jq -r '...as above...' file.json | csvformat
(csvformat
の一部ですcsvkit
)
あるいは、タブ区切りの出力を取得する@tsv
ために代わりにinを使用することもできます。@csv