我有一个这样的对象:
{
"a" : 1,
"b" : {
"c" : {
"c1" : "abc",
"source" : "abcxyz"
},
"d" : {
"d1" : "abcd",
"source" : "abcxyz"
},
"e" : {
"e1" : "abcde",
"source" : "abcxyz"
}
}
}
我的期望是
{
"a" : 1,
"b" : {
"c" : {
"c1" : "abc"
},
"d" : {
"d1" : "abcd"
},
"e" : {
"e1" : "abcde"
}
}
}
我想删除" source"属性。如果不指定键,我怎么能这样做" c"," d"或者" e",因为它们是动态的。
答案 0 :(得分:4)
遍历.b
中的所有元素,然后将其值设置为从中删除.source
元素的结果:
.b[] |= del(.source)
答案 1 :(得分:2)
这是另一种解决方案
del( .b[].source )
答案 2 :(得分:1)
可以在jq的下一个版本中使用内置函数walk/1
。
但是当前的jq-1.5没有walk/1
所以你必须从buitin.jq
复制它
https://github.com/stedolan/jq/blob/master/src/builtin.jq
将以下代码保存为hoo.jq
def walk(f):
. as $in
| if type == "object" then
reduce keys[] as $key
( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;
walk(if type == "object" then del(.source) else . end)
运行
$ jq -f hoo.jq < YOUR_JSON.json