【问题标题】:jq - remove non-matching fields in "object-array-with-objects"jq - 删除 \"object-array-with-objects\" 中的不匹配字段
【发布时间】:2022-12-15 11:41:38
【问题描述】:

给定以下 JSON 对象:

{
  "meta": {
    "data1": {
      "keep": "true"
    }
  },
  "detail": {
    "data2": [
      {
        "keep1": "keep1value",
        "keep2": "keep2value",
        "nokeep1": "abc"
      }
    ],
    "data3": [
      {
        "keep1": "keep1value",
        "keep2": "keep2value",
        "nokeep2": "abc"
      }
    ]
  },
  "drop" : "this"
}

我试图通过删除不需要的字段来清理它,例如“remove”、“nokeep1”和“nokeep2”。 然而,“data2”和“data3”数组中的对象可能包含比示例“nokeepX”更多的字段,但将始终包含我想保留的“keep1”和“keep2”。

我想要的输出是以下 JSON:

{
    "meta": { "data1": { "keep": "true" } },
    "detail": {
        "data1": [
            {
                "keep1": "keep1value",
                "keep2": "keep2value"
            }
        ],
        "data2": [
            {
                "keep1": "keep1value",
                "keep2": "keep2value"
            }
        ]
    }
}

我已经设法用这个查询删除了“drop”字段:
jq 'def pick($paths): . as $root | reduce ($paths[]|[.]|flatten(1)) as $path ({}; . + setpath($path; $root|getpath($path))); pick([["meta"], ["detail", "data1"], ["detail", "data2"]])'

然而,我一直在努力弄清楚如何删除“nokeepX”字段——是否有可能做到这一点?

【问题讨论】:

  • data2data3是如何变成data1data2的?

标签: json jq


【解决方案1】:

只需提供所有指向del的具体路径:

del(
  .detail.data2[0].nokeep1,
  .detail.data3[0].nokeep2,
  .drop
)

Demo

或者通过例如概括使用不带索引的 [] 遍历所有数组项(不仅仅是第一个):

del(
  .detail.data2[].nokeep1,
  .detail.data3[].nokeep2,
  .drop
)

Demo

或者使用.. 任意深入,只提供最深的字段名称:

del(.. | objects | .nokeep1, .nokeep2, .drop)

Demo

输出:

{
  "meta": {
    "data1": {
      "keep": "true"
    }
  },
  "detail": {
    "data2": [
      {
        "keep1": "keep1value",
        "keep2": "keep2value"
      }
    ],
    "data3": [
      {
        "keep1": "keep1value",
        "keep2": "keep2value"
      }
    ]
  }
}

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 2022-12-01
    • 2023-03-05
    • 2021-02-19
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多