从匹配特定键的 JSON 中删除所有值

mps*_*mps 5 bash recursion json key jq

通过特定标签/键从整个 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": []
            }
         ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我想删除所有带有 label 的元素"remove",以便最终结果如下所示:

{
   "root": [
      {
         "name": "blah 1",
         "new list": [
            {
               "name": "blah 2",
               "new list": [
                  {
                     "name": "blah 3"
                  }
               ]
            },
            {
               "name": "blah 6",
               "new list": []
            }
         ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*693 5

这将在 jq 中获得所需的结果。

jq 'del(..|.remove?)'
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 4

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

jtc -pw'<remove>l:' sample.json
Run Code Online (Sandbox Code Playgroud)

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

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