{
"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"
}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但收到错误
无法用字符串“标题”索引数组
jq -r '.content[]|[.Title,.brand,.characteristics,.value]' $jsonfile.
Run Code Online (Sandbox Code Playgroud)
我正在尝试与其他部分在同一行上,但遇到相同的错误。
我该如何解决这个问题?
预期输出:
abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low
Run Code Online (Sandbox Code Playgroud)
Kus*_*nda 14
你没有得到Cannot index array with string "Title"
那个命令,你得到了
[
"abc",
"xyz",
null,
null
]
Run Code Online (Sandbox Code Playgroud)
因为数组的对象中没有characteristics
orvalue
键contents
(它们是.details.Temperature
子数组中的键)。
该命令将会给你的消息是:
jq -r '.[] | [.Title,.brand,.characteristics,.value]' "$jsonfile"
Run Code Online (Sandbox Code Playgroud)
或者
jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"
Run Code Online (Sandbox Code Playgroud)
缺少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"
Run Code Online (Sandbox Code Playgroud)
该<object(s)> as <variable>
就像在一个循环中jq
,所以这里所发生的是,$t
将被分配的每个元素.details.Temperature[]
反过来,对于每个元素,一个新的数组构造。该数组将通过@csv
它将输出 CSV 格式的行。
jq
将始终双引号其 CSV 输出的字段。去掉不必要的引号:
jq -r '...as above...' file.json | csvformat
Run Code Online (Sandbox Code Playgroud)
(csvformat
是 的一部分csvkit
)
或者,您可能希望使用@tsv
代替@csv
来获取制表符分隔的输出。