我对JSON和jq的经验很少,并且正在努力重新格式化JSON对象。每个对象包含一对键/值对和一个对象数组。我正在尝试重新构造每个对象,使其仅是键/值对的列表(即,提取数组中的对象)。
[
{
"key1":"value1",
"key2":"value2",
"key 3":[
{
"a":"key_to_be_extracted_1",
"v":"value_to_be_extracted_1"
},
{
"a":"key_to_be_extracted_2",
"v":"value_to_be_extracted_2"
}
]
},
{
"key1":"value1",
"key2":"value2",
"key 3":[
{
"a":"key_to_be_extracted_1",
"v":"value_to_be_extracted_1"
},
{
"a":"key_to_be_extracted_2",
"v":"value_to_be_extracted_2"
}
]
}
]
我要去的是:
[
{
"key1":"value1",
"key2":"value2",
"key_to_be_extracted_1":"value_to_be_extracted_1",
"key_to_be_extracted_2":"value_to_be_extracted_2"
},
{
"key1":"value1",
"key2":"value2",
"key_to_be_extracted_1":"value_to_be_extracted_1",
"key_to_be_extracted_2":"value_to_be_extracted_2"
}
]
任何与此有关的帮助都将是惊人的!
答案 0 :(得分:1)
jq具有一个from_entries
函数,该函数期望包含{key, value}
个对象的数组并生成一个对象。因此,您可以将“键3”值转换为这样的数组,并产生如下对象:
."key 3" | map({key: .a, value: .v} | from_entries
将其与仅复制其他两个键的地图一起放置:
map({key1, key2} + (."key 3" | map({key: .a, value: .v}) | from_entries))
答案 1 :(得分:0)
如果要避免必须指定要保留的密钥,可以使用:
map( .
+ (."key 3" | map( {(.a): .v} ) | add )
| del(."key 3") )
也就是说,添加新的键值对,然后删除“键3”。还请注意,此处使用add
代替了from_entries
,这使解决方案更加简洁和直接。