首页 > 解决方案 > 使用 JQ 格式化嵌套的 JSON 输入?

问题描述

我正在尝试使用 jq 将下面的示例输入转换为下面的输出:

输入 JSON

  "elements": [
    {
      "type": "CustomObjectData",
      "id": "2185",
      "fieldValues": [
        {
          "type": "FieldValue",
          "id": "169",
          "value": "9/6/2017 12:00:00 AM"
        },
        {
          "type": "FieldValue",
          "id": "190",
          "value": "ABC"
        } 
        ]
        },
 {
      "type": "CustomObjectData",
      "id": "2186",
      "contactId": "13",
      "fieldValues": [
        {
          "type": "FieldValue",
          "id": "169",
          "value": "8/31/2017 12:00:00 AM"
        },
        {
          "type": "FieldValue",
          "id": "190",
          "value": "DEF"
        }
        ]
        }
]

期望的输出(按 id 分组)

本质上是试图从每个“fieldValues”对象中提取“value”字段并按“id”分组

{
"id:"2185",
"value": "9/6/2017 12:00:00 AM",
 "value": "ABC"
},
{
"id:"2186",
"value": "8/31/2017 12:00:00 AM",
 "value": "DEF"
}

我应该使用什么 jq 语法来实现这一点?非常感谢!!

标签: jsonjq

解决方案


假设 Q 中显示的输入已以明显的方式修改为有效 JSON,以下过滤器将生成如下所示的输出,即类似于包含在中的所谓预期输出的有效 JSON 值流Q. 如果需要单个数组,一种可能性是将程序包装在方括号中。

程序.jq

.elements[]
| {id, values: [ .fieldValues[].value] }

输出

{
  "id": "2185",
  "values": [
    "9/6/2017 12:00:00 AM",
    "ABC"
  ]
}
{
  "id": "2186",
  "values": [
    "8/31/2017 12:00:00 AM",
    "DEF"
  ]
}

生成 CSV

多种可能性之一:

.elements[]
| [.id] + [.fieldValues[].value]
| @csv

使用 -r 命令行选项,这将生成以下 CSV:

"2185","9/6/2017 12:00:00 AM","ABC"
"2186","8/31/2017 12:00:00 AM","DEF"

推荐阅读