jq json 解析器连接嵌套数组对象值

jq json parser concate nested array object value

您好,我有下面的 JSON 文件和嵌套对象:

{
  "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不存在,则忽略解析并继续下一个子对象。

如何实现?谢谢。

您可以使用以下 jq 命令:

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

jq 足够聪明,可以打印 .name.Building[].name 的组合,因为 .Building 是一个数组。 .Building[].nameFloor[]?.name 应用了相同的操作。 ? 因为地板并不总是固定的。

这是一个使用 jq 变量的解决方案

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