2016-08-03 77 views
0

您好我有嵌套对象下面的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 NameBuilding NameFloor name,并在其间插入一个<符号。

如果嵌套对象字段Floor不存在,则忽略解析并继续下一个子对象。

如何实现这一目标?谢谢。

回答

0

您可以使用下面的命令jq

jq '.Maps.Campus[]|"\(.name)>\(.Building[]|"\(.name)>\(.Floor[]?.name)")"' file.json 

jq是足够聪明,打印.name.Building[].name组合,因为.Building是一个数组。同样的动作得到应用于.Building[].nameFloor[]?.name?,因为楼层并不总是设置。

+0

对不起,我最初的职位是错误的,因为我不能发布一个长JSON代码到计算器,它总是提示我“大多代码,请添加更多注释”警告。现在我已经更新了我的JSON文件和需求。谢谢。 – Xianlin

+0

检查我的更新 – hek2mgl

+0

因此对于嵌套的json数组,使用多重管道'|'和'()'将这些值嵌套在一起并构造过滤器。谢谢。 – Xianlin

0

下面是使用JQ变量的解决方案

.Maps.Campus[] 
| .name as $campus 
| .Building[] 
| .name as $bldg 
| .Floor[]? 
| .name as $floor 
| "\($campus)>\($bldg)>\($floor)"