【问题标题】:Is there a way to delete the same key from a list of objects within a nested field?有没有办法从嵌套字段中的对象列表中删除相同的键?
【发布时间】:2019-10-07 12:03:16
【问题描述】:

我正在设置一个 devops 管道,以便以 JSON 格式存储的某些数据配置文件可以在不同的服务器之间转移。从当前服务器下载它时,我需要清理所有受保护的密钥和唯一标识符。我正在寻找在 JQ 中执行以下操作的最干净的方法

输入:

{
   "TopKey1":{
      "some_key":"some_value"
   },
   "TopKey2":{
      "some_key2":"some_value2"
   },
   "KeytoSearch":[
      {
         "_id":"sdf",
         "non_relevant_key1":"val"
      },
      {
         "_id":"sdfdsdf",
         "non_relevant_key2":"val"
      },
      {
         "_id":"sgf",
         "non_relevant_key3":"val"
      }
   ]
}

输出:

{
   "TopKey1":{
      "some_key":"some_value"
   },
   "TopKey2":{
      "some_key2":"some_value2"
   },
   "KeytoSearch":[
      {
         "non_relevant_key1":"val"
      },
      {
         "non_relevant_key2":"val"
      },
      {
         "non_relevant_key3":"val"
      }
   ]
}

如果这是一本字典,用 Python 术语来说

for json_object in dictionary["KeytoSearch"]:
  json_object.pop("_id")

我尝试了 map 和 del 的组合,但似乎无法用它找出嵌套索引。我收到的错误消息类似于jq: error (at <stdin>:277): Cannot index string with string "_id",这告诉我我还没有从根本上理解 jq 是如何工作或将被使用的,但这是我需要走的路,因为使用 Python 脚本来清理JSON 对象是我宁愿避免的东西

【问题讨论】:

  • @Inian :感谢您指出我已经编辑了我的帖子,希望现在应该清楚了
  • @peak 道歉我将它从 JSON 验证器粘贴到一组花括号中,使其无效,我希望最小/可读性方面很好
  • fibonachoceres - 没问题!

标签: json key jq


【解决方案1】:

使用您的输入 JSON 并假设您的 KeytoSearch 对象中还有其他属性以及 _id 字段,您可以在下面执行。

jq 'del(.KeytoSearch[]._id)'

请参阅this jqplay.orgsn-p 以获取演示。不需要在包含 _ 的属性键周围加上引号,如下面的 cmets 之一所确认的那样。一些元字符(例如属性键值中的. 需要使用引号作为".id" 访问)需要正确引用,但_ 显然不是其中之一。

【讨论】:

  • 谢谢你这对我有用,而且看起来也很简单,我想我错过了数组枚举的 [] 运算符,现在从文档中可以清楚地看到。
  • 是的,我知道我想在某个地方搜索我读到的某个旧版本的 jq 需要此引号的帖子。找不到哪个版本的权威参考
  • 下划线一直被视为“字母数字”字符。例如。使用 jq 1.3:echo '{"_": 1}' | jq-1.3 ._
【解决方案2】:

我尝试过 map 和 del 的组合

好!你可能只是错过了 '|=' 魔法成分:

.Keytosearch |= map( del(._id) )

【讨论】:

    【解决方案3】:

    或者,您可以为 JSON 使用 walk-path unix 工具:jtc 并将更改直接应用到源 json 文件 (-f):

    bash $ jtc -fpw'[KeytoSearch]<_id>l:' file.json 
    bash $ 
    bash $ 
    bash $ jtc file.json 
    {
       "KeytoSearch": [
          {
             "non_relevant_key1": "val"
          },
          {
             "non_relevant_key2": "val"
          },
          {
             "non_relevant_key3": "val"
          }
       ],
       "TopKey1": {
          "some_key": "some_value"
       },
       "TopKey2": {
          "some_key2": "some_value2"
       }
    }
    bash $ 
    

    如果给定的 json sn-p 是较大 JSON 的一部分(并且 [KeytoSearch] 无法从根中寻址),则将其替换为搜索词素:&lt;KeytoSearch&gt;l

    PS> 披露:我是jtc 工具的创建者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2014-05-28
      • 2017-12-31
      相关资源
      最近更新 更多