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

Posted

技术标签:

【中文标题】从匹配特定键的 JSON 中删除所有值【英文标题】:remove all values from JSON matching specific key 【发布时间】: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 感知实用程序。

【问题讨论】:

【参考方案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?)'

【讨论】:

以上是关于从匹配特定键的 JSON 中删除所有值的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:根据键的值有条件地过滤 JSON? [复制]

从数组中删除与 PHP 中的特定条件匹配的项目

从数组中的所有对象中获取特定键的值

如何在redis中删除与特定模式匹配的键

如何从特定数据库中的所有表中检索不属于主键和外键的所有列

删除文件中与模式不匹配的行