JQ JSON解析器concate嵌套数组对象值
问题描述:
您好我有嵌套对象下面的JSON文件:JQ JSON解析器concate嵌套数组对象值
{
"Maps": {
"Campus": [
{
"name": "nus",
"Building": [
{
"name": "sde1",
"Floor": [
{
"name": "floor1"
},
{
"name": "floor2"
}
]
},
{
"name": "sde2"
}
]
},
{
"name": "ntu",
"Building": [
{
"name": "ece1",
"Floor": [
{
"name": "floor1"
},
{
"name": "floor2"
}
]
},
{
"name": "ece2"
}
]
}
]
}
}
我想用jq
来分析上面的JSON文件,并得到如下格式:
nus>sde1>floor1
nus>sde1>floor2
ntu>ece1>floor1
ntu>ece1>floor2
基本上我必须连接Campus Name
与Building Name
和Floor name
,并在其间插入一个<
符号。
如果嵌套对象字段Floor
不存在,则忽略解析并继续下一个子对象。
如何实现这一目标?谢谢。
答
您可以使用下面的命令jq
:
jq '.Maps.Campus[]|"\(.name)>\(.Building[]|"\(.name)>\(.Floor[]?.name)")"' file.json
jq
是足够聪明,打印.name
和.Building[].name
组合,因为.Building
是一个数组。同样的动作得到应用于.Building[].name
和Floor[]?.name
。 ?
,因为楼层并不总是设置。
答
下面是使用JQ变量的解决方案
.Maps.Campus[]
| .name as $campus
| .Building[]
| .name as $bldg
| .Floor[]?
| .name as $floor
| "\($campus)>\($bldg)>\($floor)"
对不起,我最初的职位是错误的,因为我不能发布一个长JSON代码到计算器,它总是提示我“大多代码,请添加更多注释”警告。现在我已经更新了我的JSON文件和需求。谢谢。 – Xianlin
检查我的更新 – hek2mgl
因此对于嵌套的json数组,使用多重管道'|'和'()'将这些值嵌套在一起并构造过滤器。谢谢。 – Xianlin