JQ删除多个属性

时间:2016-07-28 03:47:14

标签: json jq

我有一个这样的对象:

{
    "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",因为它们是动态的。

3 个答案:

答案 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

参考:recursive reduce arrays using jq