【问题标题】:JQ delete multiple propertiesJQ删除多个属性
【发布时间】:2016-07-28 03:47:13
【问题描述】:

我有一个这样的对象:

{
    "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"
        }
    }
}

我想删除“源”属性。我如何在不指定键“c”、“d”或“e”的情况下做到这一点,因为它们是动态的。

【问题讨论】:

    标签: json jq


    【解决方案1】:

    遍历.b 中的所有元素,然后将它们的值设置为从中删除.source 元素的结果:

    .b[] |= del(.source)
    

    【讨论】:

    【解决方案2】:

    这是另一个解决方案

    del( .b[].source )
    

    【讨论】:

      【解决方案3】:

      可能在 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

      【讨论】:

      • 我创建了一个 hoo.jq 文件并运行命令。但是,我有一个编译错误error: syntax error, unexpected INVALID_CHARACTER。我该如何解决?非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2016-08-07
      • 1970-01-01
      相关资源
      最近更新 更多