首页 > 解决方案 > jq 将 JSON 子数组对象转换为分隔字符串

问题描述

我想用 jq 转换以下输入:

{
   "root":[
      {
         "field1":"field1value1",
         "field2":"field2value2",
         "field3Array":[
            {
               "prop1":"prop1_value1"
            }
         ]
      },
      {
         "field1":"field1value3",
         "field2":"field2value4",
         "field3Array":[
            {
               "prop1":"prop1_value3"
            },
            {
               "prop1":"prop1_value4"
            }
         ]
      }
   ]
}

输出应该是:

[
  {
    "field1": "field1value1",
    "field2": "field2value2",
    "field3Array": "prop1_value1"
  },
  {
    "field1": "field1value3",
    "field2": "field2value4",
    "field3Array": "prop1_value3,prop1_value4"
  }
]

到目前为止,我使用这个 jq 过滤器:

[.root[] | {field1, field2, field3Array: .field3Array[].prop1}]

但我不知道如何将数组属性加入"prop1"逗号分隔的字符串"prop1_value3,prop1_value4"

https://jqplay.org/s/CR8mGBX8Dz

标签: jsonjq

解决方案


您需要将 中包含的对象映射field3Array到它们的字符串值并加入结果数组:

.root | map({field1, field2, field3Array: .field3Array | map(.prop1) | join(",")})

你可以在这里试试。


.field3Array在以下我们可以就地更新而不是重新创建整个对象时,可以稍微简化它:

.root | map(.field3Array |= (map(.prop1) | join(",")))

你可以在这里试试。


如果您不熟悉该map功能,以下方法也可以:

[.root[] | {field1, field2, field3Array: [ .field3Array[] | .prop1 ] | join(",")}]

你可以在这里试试。


推荐阅读