首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JQ将复杂的JSON文件转换为简单的JSON文件,而不需要得到笛卡尔乘积

使用JQ将复杂的JSON文件转换为简单的JSON文件,而不需要得到笛卡尔乘积
EN

Stack Overflow用户
提问于 2018-07-02 21:47:52
回答 1查看 89关注 0票数 2

我想使用JQ将一个复杂的JSON文件转换成一个简单的JSON文件。但是,我使用的查询生成了不正确的输出。

我的(精简) JSON文件:

代码语言:javascript
复制
[
  {
    "id": 100,
    "foo": [
      {
        "bar": [
          {"type": "read"},
          {"type": "write"}
        ],
        "users": ["admin_1"],
        "groups": []
      },
      {
        "bar": [
          {"type": "execute"},
          { "type": "read"}
        ],
        "users": [],
        "groups": ["admin_2"]
      }
    ]
  },
  {
    "id": 101,
    "foo": [
      {
        "bar": [
          {"type": "read"}
        ],
        "users": [
          "admin_3"
        ],
        "groups": []
      }
    ]
  }
]

我需要生成一个更平坦的JSON文件,并将用户和组合并到一个字段中,如下所示:

代码语言:javascript
复制
 [
  {
    "id": 100,
    "users_groups": [
      "admin_1",
      "admin_2"
    ],
    "bar": ["read"]
  },
  {
    "id": 100,
    "users_groups": ["admin_1"],
    "bar": ["write"]
  },
  {
    "id": 100,
    "users_groups": ["admin_2"],
    "bar": ["execute"]
  },
   {
    "id": 101,
    "users_groups": ["admin_3"],
    "bar": ["read"]
  }
 ]  

我在JQ中尝试的所有操作都会导致我得到错误的输出(其中admin_1错误地使用了bar=execute,而admin_2错误地使用了bar=write),如下所示:

代码语言:javascript
复制
[
  {
    "id": 100,
    "users_groups": [
      "admin_1",
      "admin_2"
    ],
    "bar": ["read", "write", "execute"]
  },
   {
    "id": 101,
    "users_groups": ["admin_3"],
    "bar": ["read"]
  }
 ] 

我已经尝试了很多不同的查询方法--你知道我应该怎么做吗?

代码语言:javascript
复制
    cat file.json | jq -r '[.[] | select(has("foo")) |{"id", "users":(.foo[] | .users), "groups":(.foo[] | .groups), "bar":([.foo[].bar[] | .type])} ] '
EN

回答 1

Stack Overflow用户

发布于 2018-07-02 23:32:09

下面的筛选器按照问题似乎需要的"type“进行分组:

代码语言:javascript
复制
map(.id as $id
    | [.foo[]
      | {id: $id, bar: .bar[].type} +
        {"users_groups": (.users + .groups)[]} ]
    | group_by(.bar)
    | map(.[0] + {"users_groups": [.[].users_groups]}) )

输出

代码语言:javascript
复制
[
  [
    {
      "id": 100,
      "bar": "execute",
      "users_groups": [
        "admin_2"
      ]
    },
    {
      "id": 100,
      "bar": "read",
      "users_groups": [
        "admin_1",
        "admin_2"
      ]
    },
    {
      "id": 100,
      "bar": "write",
      "users_groups": [
        "admin_1"
      ]
    }
  ],
  [
    {
      "id": 101,
      "bar": "read",
      "users_groups": [
        "admin_3"
      ]
    }
  ]
]

变体

要实现对象数组输出格式,只需添加| [.[][]]即可;同样,确保.bar是数组值也很容易,尽管这可能没有意义,因为分组是按.type进行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51137733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档