首页 > 解决方案 > 使用 jq 在深度嵌套的 JSON 中过滤对象的键

问题描述

给定以下输入

[
  {
    "k1":[{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6}],
    "k2":[{"a":1,"b":2,"c":3,"d":4,"e":5,"f":6}]
  }
]

我应该如何继续获得以下输出?

[
  {
    "k1":[{"a":1,"b":2}],
    "k2":[{"a":1,"b":2}]
  }
]

即我在JSON中有一些对象,我想删除那些嵌套对象中除"a"and之外的所有键"b",并保留原始JSON结构。

但是请注意,原始对象可能有几十个键,我只想保留其中的 2 或 3 个。

对于简单的顶级操作,我能够选择具有{a:.a, b:.b}or{a,b}语法的对象子集,但在嵌套上下文中,我不知道如何继续并保留 JSON 结构。

一般来说,在不改变父级的情况下,在深度嵌套级别上进行操作的最佳态度是什么?

标签: jsonnestedjqtree-traversal

解决方案


简而言之,walk是你的朋友。

(如果它在你的 jq 中不可用,只需在你的 jq 程序中包含它的 def;通过谷歌搜索可以很容易地找到 def:jq def walk)

以下的一些变化应该可以解决眼前的问题:

walk( if type == "object" then {a,b} else . end )

推荐阅读