当前位置: 首页 > 知识库问答 >
问题:

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

慕铭
2023-03-14

通过特定的标签/键从整个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": []
            }
         ]
      }
   ]
}

并且我想删除所有带有标签“删除”元素,以便最终结果如下所示:

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

使用sed/awk会产生意想不到的结果(尤其是当有嵌套对象要删除时),因此它必须是一个支持JSON的实用工具,如jq或类似工具。

共有2个答案

公西财
2023-03-14

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

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

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

PS

常哲彦
2023-03-14

这在jq中得到了期望的结果。

jq 'del(..|.remove?)'
 类似资料:
  • 我试图递归删除JSON对象和所有子对象中的空值。如果子对象的关键点都已删除,则我希望该子对象也被删除。 比如。 应该变成这样: 下面是我编写的删除所有空值键的函数: 但这不会删除没有子项的父项: 因此,我得到的不是上面的结果,而是: 如您所见,它不会删除申请人的密钥。我如何在函数中检查它?或者它是否需要编写在我调用delKeys()后调用的单独函数中? 还有,有人看到这达到了最大递归深度吗?我尝试

  • 我使用的是,我希望删除所有出现的特定元素。 它只删除了第一次出现的情况。但是我希望在我希望list仅用值“second”省略。我通过谷歌搜索发现,可以通过创建新列表并调用来实现。但是,是否有可能在不创建新列表的情况下删除所有事件,或者是否有任何可用的API来实现它?

  • 这是带有Resharper终极试用版的Visual Studio 2015

  • 我读了很多帖子提到删除匹配模式的键。我想删除与特定模式不匹配的键。

  • 我知道这可能是一个重复,但仍然张贴我的问题,因为我找不到确切的答案我在寻找什么。我有一个json对象(或字符串)如下。 我将从RESTAPI测试中得到相同类型的响应,但是在每次调用之后,“timestamp”键将具有一个动态日期和时间值,该值与调用的时间有关。在这里,我使用JSONAssert将我的expect json与实际json作为一个整体进行比较。因为时间戳值不同,所以对我来说总是失败。

  • 问题内容: 我已经在这个问题中尝试过方法,但是由于我在集群模式下工作,因此它不起作用,redis告诉我: (错误)CROSSSLOT请求中的键未哈希到同一插槽 问题答案: 该问题的答案尝试在一个中删除多个键。但是,与给定模式匹配的键可能不会位于同一插槽中,并且如果这些键不属于同一插槽,则Redis Cluster不支持多键命令。这就是为什么您收到错误消息。 为了解决此问题,您需要一对一地使用以下密