我正在尝试将 key1: 值数组、key2: 值数组、.... 的 json 结构转换为对象数组。数组的大小相同,每个对象只是每个数组中位置 x 处的项目的聚合。需要帮助最好使用 jq 的通用代码进行转换。
输入
{
"IdentifierName": [
"A",
"B",
"C"
],
"Code": [
5,
8,
19
]
}
预期输出
[
{
"IdentifierName": "A",
"Code": 5
},
{
"IdentifierName": "B",
"Code": 8
},
{
"IdentifierName": "C",
"Code": 19
}
]
编辑:到目前为止的进展:
jq 'to_entries|map(.key) as $keys| (map(.value)|transpose) as $values |$values|map($keys, .)'
最后一步是以某种方式将键索引到我仍然无法正确获取的值中。
答案1
回答我自己的问题:
jq 'to_entries|map(.key) as $keys| (map(.value)|transpose) as $values |$values|map([$keys, .] | transpose| map( {(.[0]): .[1]} ) | add)'
解释:提取键 ["IdentifierName", "Code"] 和值作为 [ [ "A", 5 ], [ "B", 8 ], [ "C", 19 ] ]
然后从键到值进行索引,取json-seq 的键元组与(每个)值元组,并将它们转置并成对压缩。
echo '[[
"IdentifierName",
"Code"
],
[
"C",
19
]
]'|jq '.|transpose| map( {(.[0]): .[1]} ) | add'
结合两者给出解决方案。这适用于任意数量的元素(0 和 1 只是键和值,而不是第一个和第二个)。
答案2
$ jq '[.IdentifierName, .Code] | transpose | map( { "IdentifierName": .[0], "Code": .[1] } ) ' file.json
[
{
"IdentifierName": "A",
"Code": 5
},
{
"IdentifierName": "B",
"Code": 8
},
{
"IdentifierName": "C",
"Code": 19
}
]
我将两个数组提取到一个转置的数组(两个数组)中。对于给定的数据,这会产生[["A",5],["B",8],["C",19]]
。然后,我将该数组的每个单独元素映射到具有所需键的对象。
这可能会以某种方式变得更简洁。例如,它将是好的不必在最后用显式的键名称重建对象,如果可以将其概括为n子数组,不仅仅是两个。