将键值对的数组展平为对象

时间:2019-06-21 08:36:00

标签: json jq

我对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"
   }
]

任何与此有关的帮助都将是惊人的!

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,这使解决方案更加简洁和直接。