使用jq将Json表数组转换为对象

使用jq将Json表数组转换为对象

我正在尝试将 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子数组,不仅仅是两个。

相关内容