我有一个 json
[
{
"name": "type1",
"type": "string",
"values": {
"set1": "dataA1",
"set1": "dataA2"
}
},
{
"name": "type2",
"type": "string",
"values": {
"set1": "dataB1",
"set2": "dataB2"
}
},
{
"name": "null",
"type": "string",
"values": {
"set1": "dataC1",
"set2": "dataC2"
}
},
{
"name": "type4",
"type": "string",
"values": {
"set1": "dataD1",
"set2": "dataD2"
}
}
]
这是一个很长的 json,所以我想把它做成这样。
{
"type1": {
"type": "string",
"values": {
"set1": "dataA1",
"set2": "dataA2"
}
},
null: {
"type": "string",
"values": {
"set1": "dataB1",
"set2": "dataB2"
}
},
"type3": {
"type": "string",
"values": {
"set1": "dataC1",
"set2": "dataC2"
}
},
"type4": {
"type": "string",
"values": {
"set1": "dataD1",
"set2": "dataD2"
}
}
}
所以我想问一下这个到底好不好还是应该用旧的。如果这个更好的话我以前用过jq '.[] | .name, .type' file.json
然后如何使用新的 json 获取这样的输出
"key"
"type"
"key"
"type"
"key"
"type"
所以输出变成
type1
string
type2
string
# the type3 and its type is not needed cause its null
type4
string
另外,某些值名称为空,所以我不希望字符串也为空。
答案1
您可以使用to_entries
,然后选择非空键并提取值:
jq 'to_entries | map(select(.key != "null"))[] | (.key, .value.type)' < file2.json
答案2
类似的想法另一个答案但作用于原始 JSON 文档而不将name
键的值转换为键:
$ jq -r 'map( select(.name != "null") | .name, .type )[]' file
type1
string
type2
string
type4
string
这会提取顶级数组中name
值不是 string的所有条目null
。然后它从剩余条目中提取name
和值。type
一般来说,使用意义不大数据作为 JSON 中键的值,这就是我选择使用原始文件的原因。