【问题标题】:remove all values from JSON matching specific key从匹配特定键的 JSON 中删除所有值
【发布时间】:2019-12-27 21:59:46
【问题描述】:

通过特定标签/键从整个 JSON 中删除任意值的简单方法是什么?我的 JSON 可能有任意深度,所以按标签删除应该递归完成。

{
   "root": [
      {
         "name": "blah 1",
         "remove": [ 1, 2, 3 ],
         "new list": [
            {
               "name": "blah 2",
               "remove": null,
               "new list": [
                  {
                     "name": "blah 3",
                     "remove": [
                        {
                           "name": "blah 4",
                           "new list": []
                        },
                        {
                           "name": "blah 5",
                           "new list": []
                        }
                     ]
                  }
               ]
            },
            {
               "name": "blah 6",
               "new list": []
            }
         ]
      }
   ]
}

我想删除标签为"remove"的所有元素,这样最终的结果会是这样的:

{
   "root": [
      {
         "name": "blah 1",
         "new list": [
            {
               "name": "blah 2",
               "new list": [
                  {
                     "name": "blah 3"
                  }
               ]
            },
            {
               "name": "blah 6",
               "new list": []
            }
         ]
      }
   ]
}

使用sed/awk 会产生意想不到的结果(尤其是在要删除嵌套对象时),因此它必须是像 jq 或类似的 JSON 感知实用程序。

【问题讨论】:

    标签: json bash recursion key jq


    【解决方案1】:

    还有一种简单的方法可以使用基于 walk-path 的 unix 实用程序 jtc 来实现相同目的:

    jtc -pw'<remove>l:' sample.json
    

    - 它将递归删除所有出现的标签"remove"。如果您想将更改直接应用到源文件 (sample.json),请添加选项 -f

    PS> 披露:我是jtc - 用于 JSON 操作的 shell cli 工具的创建者

    【讨论】:

    • 谢谢,下载了这个工具并让它与测试 .json 和我需要处理的真实文件一起工作
    【解决方案2】:

    这会在 jq 中得到想要的结果。

    jq 'del(..|.remove?)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2020-12-13
      • 2018-12-24
      • 1970-01-01
      • 2018-09-26
      • 2021-10-25
      相关资源
      最近更新 更多