我想使用JQ将一个复杂的JSON文件转换成一个简单的JSON文件。但是,我使用的查询生成了不正确的输出。
我的(精简) JSON文件:
[
{
"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文件,并将用户和组合并到一个字段中,如下所示:
[
{
"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),如下所示:
[
{
"id": 100,
"users_groups": [
"admin_1",
"admin_2"
],
"bar": ["read", "write", "execute"]
},
{
"id": 101,
"users_groups": ["admin_3"],
"bar": ["read"]
}
]
我已经尝试了很多不同的查询方法--你知道我应该怎么做吗?
cat file.json | jq -r '[.[] | select(has("foo")) |{"id", "users":(.foo[] | .users), "groups":(.foo[] | .groups), "bar":([.foo[].bar[] | .type])} ] '
发布于 2018-07-02 23:32:09
下面的筛选器按照问题似乎需要的"type“进行分组:
map(.id as $id
| [.foo[]
| {id: $id, bar: .bar[].type} +
{"users_groups": (.users + .groups)[]} ]
| group_by(.bar)
| map(.[0] + {"users_groups": [.[].users_groups]}) )
输出
[
[
{
"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
进行的。
https://stackoverflow.com/questions/51137733
复制相似问题