使用jq过滤深度嵌套JSON中对象的键

relj7zay  于 2023-04-08  发布在  其他
关注(0)|答案(3)|浏览(130)

给定以下输入

[
  {
    "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""b"之外的所有键,并保留原始的JSON结构。
但是请注意,原始对象可能有几十个键,我只想保留其中的2或3个。
对于简单的顶层操作,我能够选择具有{a:.a, b:.b}{a,b}语法的对象子集,但在嵌套上下文中,我不知道如何继续并保留JSON结构。
一般来说,在不改变父级别的情况下,在嵌套很深的级别上执行操作的最佳态度是什么?

dbf7pr2w

dbf7pr2w1#

简而言之,walk是您的朋友。
(If它在你jq中是不可用的,只要把它的def包含在你的jq程序中;def可以很容易地通过google找到:jq def walk)
下面的一些变化应该可以解决眼前的问题:

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

bnl4lu3b2#

您可以使用|=操作符在嵌套级别上执行您想要的操作。
还有一个相当简单的函数可以用来从json对象中选择特定的路径。
This stackoverflow.com thread有更深入的解释。

nkhmeac6

nkhmeac63#

也许这对你有用:

map({ k1 : [(.k1[]|{a,b})], k2 : [(.k2[]|{a,b})] })

test1
或者这个:

[.[]|{ k1 : [(.k1[]|{a,b})], k2 : [(.k2[]|{a,b})] }]

test2

相关问题