将平面JSON转换为按公共键名进行嵌套JSON分组
我使用JQPlay来播放格式。我无法理解如何使用reduce按子结构分组。我想根据组织或父id进行分组 只需更新我的jqplay过滤器,但不能删除两个标记以按id分组 jq播放语法- 我在jqplay.org中使用以下语法。还可以请您建议如何调试管道符号后的任何内容将平面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
.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”
- 执行
后,将得到一个包含两个数组项的结果,一个包含两个对象(id分组依据(.org)
),另一个包含一个对象(id750141
)750142
- 然后运行
中的代码,将其映射到从上一步返回的对象列表map(..)
- 我们只需要在最终结果中使用唯一的键名,因此我们只需在第一个数组中使用
。即使有多个重复的键名,这也可以工作。暂停并查看输出,直到此时[0].org
{ "org": [ { "id": "750141" }, { "id": "750142" } ] }
- 现在,使用
构造输出的其余部分,它将子节点创建为orgProperties:[{properties:{methodId:…
"orgProperties": [ { "properties": { "methodId":
- 使用
创建最后一个子数组,以创建具有id列表的键值对map({id:.methodId})
分组人(.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":