通过通用键名将平面JSON转换为嵌套JSON分组

时间:2020-01-05 23:39:28

标签: json jq

我正在使用JQPlay播放格式。我不明白如何使用归约子结构。我想根据组织或父ID进行分组。

仅更新我的jqplay过滤器,但无法删除两个按ID分组的标签。

jq播放语法-

我在jqplay.org中使用以下语法。还可以请您提出如何在管道符号后调试任何东西的方法。

.items | {"org" : map( {id : .org, orgProperties : [{"properties" : {"methodId" : [{"id" : .methodId}]}}]})| group_by(.id) | map( reduce .[] as $x (.[0]|{}; .orgProperties+= ($x | .orgProperties)))}

输入JSON

{
  "items": [
    {
      "org": "750141",
      "methodId": "1-10F7IAK7"
    },
    {
      "org": "750141",
      "methodId": "1-10TP18L0"
    },
    {
      "org": "750142",
      "methodId": "1-10TP18L1"
    }
  ]
}

输出JSON

{
  "org": [
    {
      "orgProperties": [
        {
          "properties": {
            "methodId": [
              {
                "id": "1-10F7IAK7"
              }
            ]
          }
        },
        {
          "properties": {
            "methodId": [
              {
                "id": "1-10TP18L0"
              }
            ]
          }
        }
      ]
    },
    {
      "orgProperties": [
        {
          "properties": {
            "methodId": [
              {
                "id": "1-10TP18L1"
              }
            ]
          }
        }
      ]
    }
  ]
}

期望的JSON输出

{
  "org": [
    {
      "id": "750141",
      "orgProperties": [
        {
          "properties": {
            "methodId": [
              {
                "id": "1-10F7IAK7"
              },
              {
                "id": "1-10TP18L0"
              }
            ]
          }
        }
      ]
    },
        {
      "id": "750142",
      "orgProperties": [
        {
          "properties": {
            "methodId": [
              {
                "id": "1-10TP18L1"
              }
            ]
          }
        }
      ]
    }
  ]
} 

1 个答案:

答案 0 :(得分:2)

您需要执行以下操作。您需要先group_by(),然后再进行处理

jq '.items | {org: group_by(.org) | map({id: .[0].org, orgProperties: [{properties: { methodId: map({id: .methodId}) }}]})} ' input.json

我认为没有办法提高jq抛出的调试详细级别,除非可能会修改代码以添加自己的调试语句并运行自定义构建。

我个人一次从一个组件构建过滤器,观察其输出并在此之上进行操作。破坏以上功能

  • 在过滤器的'.items | {org: ..部分之后完全重建了JSON。后续部分的结果构成了预期输出最高"org"部分之下的内容。
  • 执行group_by(.org)后,您将获得一个包含两个数组条目的结果,一个包含2个对象(id 750141),另一个包含单个对象(id 750142) 。
  • 然后您在map(..)中运行代码到上一步返回的对象列表中
  • 我们在最终结果中仅需要唯一的键名称,因此我们仅在第一个数组中使用.[0].org。即使您有多个重复的键名称,此功能也可以使用。暂停直到现在为止看看输出

    {
      "org": [
        {
          "id": "750141"
        },
        {
          "id": "750142"
        }
      ]
    }
    
  • 现在使用orgProperties: [{properties: { methodId: ...构造其余的输出,该子目录创建为

    "orgProperties": [
    {
        "properties": {
            "methodId": 
    
  • 使用map({id: .methodId})创建最终的子数组,以创建具有ID列表的键值对