将平面JSON转换为按公共键名进行嵌套JSON分组

将平面JSON转换为按公共键名进行嵌套JSON分组,json,jq,Json,Jq,我使用JQPlay来播放格式。我无法理解如何使用reduce按子结构分组。我想根据组织或父id进行分组 只需更新我的jqplay过滤器,但不能删除两个标记以按id分组 jq播放语法- 我在jqplay.org中使用以下语法。还可以请您建议如何调试管道符号后的任何内容 .items | {"org" : map( {id : .org, orgProperties : [{"properties" : {"methodId" : [{"id" : .methodId}]}}]})| group_b

我使用JQPlay来播放格式。我无法理解如何使用reduce按子结构分组。我想根据组织或父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 输出JSON 预期JSON输出
你需要像下面这样做。您需要
groupby()
然后再进行处理

jq '.items | {org: group_by(.org) | map({id: .[0].org, orgProperties: [{properties: { methodId: map({id: .methodId}) }}]})} ' input.json
我不认为有任何方法可以提高
jq
抛出的调试详细级别,除非可能修改代码以添加自己的调试语句并运行自定义构建

我个人一次从一个组件构建过滤器,观察其输出并在此基础上进行操作。要分解上述的功能

  • JSON在过滤器的
    ”部分之后被完全重构。items |{org:..
    部分。后续部分的结果形成了现在位于顶层
    “org”
    部分下面的内容,即预期输出
  • 执行
    分组依据(.org)
    后,将得到一个包含两个数组项的结果,一个包含两个对象(id
    750141
    ),另一个包含一个对象(id
    750142
  • 然后运行
    map(..)
    中的代码,将其映射到从上一步返回的对象列表
  • 我们只需要在最终结果中使用唯一的键名,因此我们只需在第一个数组中使用
    [0].org
    。即使有多个重复的键名,这也可以工作。暂停并查看输出,直到此时

    {
      "org": [
        {
          "id": "750141"
        },
        {
          "id": "750142"
        }
      ]
    }
    
  • 现在,使用
    orgProperties:[{properties:{methodId:…
    构造输出的其余部分,它将子节点创建为

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


谢谢你,伙计。这很有效,很好的一点是我现在明白了这是怎么做的。但是你能解释一下我们为什么使用[0]…这意味着什么吗。@user2993735:在
分组人(.org)之后
,创建了两个数组,第一个数组的值
.org
750141
相同。因此,我们使用
[0]
将这两个数组缩减为一个数组,这与执行
[1]
相同。请查看
.items.{.org:group\u by(.org)}
的输出,并亲自查看。
jq '.items | {org: group_by(.org) | map({id: .[0].org, orgProperties: [{properties: { methodId: map({id: .methodId}) }}]})} ' input.json
{
  "org": [
    {
      "id": "750141"
    },
    {
      "id": "750142"
    }
  ]
}
"orgProperties": [
{
    "properties": {
        "methodId":