我想删除所有以“ hide”开头的键。重要的是要注意,键可能嵌套在许多级别。我想使用正则表达式来查看答案,尽管我知道在我的示例中,一个简单的contains
就足够了。 (我也不知道如何使用contains
来做到这一点,顺便说一句。)
输入JSON 1:
{
"a": 1,
"b": 2,
"hideA": 3,
"c": {
"d": 4,
"hide4": 5
}
}
所需的输出JSON:
{
"a": 1,
"b": 2,
"c": {
"d": 4
}
}
输入JSON 2:
{
"a": 1,
"b": 2,
"hideA": 3,
"c": {
"d": 4,
"hide4": 5
},
"e": null,
"f": "hiya",
"g": false,
"h": [{
"i": 343.232,
"hide9": "private",
"so_smart": true
}]
}
谢谢!
答案 0 :(得分:3)
由于您只是检查键的开始,因此在这种情况下,可以使用startswith/1
,否则可以使用test/1
或test/2
。然后,您可以将要删除的路径传递给delpaths/1
。
您可能希望事先按字符串过滤键(或转换为字符串)以说明树中的数组。
delpaths([paths | select(.[-1] | strings | startswith("hide"))])
delpaths([paths | select(.[-1] | strings | test("^hide"; "i"))])
答案 1 :(得分:1)
解决问题的一种直接方法是将walk
与with_entries
结合使用,例如
walk(if type == "object"
then with_entries(select(.key | test("^hide") | not))
else . end)
如果您的jq没有walk/1
,则只需在调用它之前包含其def(例如从https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq中获得)即可。