【问题标题】:jq json parser concate nested array object valuejq json解析器连接嵌套数组对象值
【发布时间】:2016-08-03 08:52:56
【问题描述】:

您好,我有以下带有嵌套对象的 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不存在,则忽略解析并继续下一个子对象。

如何做到这一点?谢谢。

【问题讨论】:

    标签: json parsing jq


    【解决方案1】:

    您可以使用以下jq 命令:

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

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

    【讨论】:

    • 对不起,我最初的帖子是错误的,因为我无法将长 json 代码发布到 stackoverflow 中,它总是提示我“主要是代码,请添加更多 cmets”警告。现在我更新了我的 JSON 文件和要求。谢谢。
    • 所以对于嵌套的 json 数组,使用多个管道 |() 将这些值嵌套在一起并构造过滤器。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多