有没有办法从嵌套字段内的对象列表中删除相同的键?

时间:2019-05-21 06:36:31

标签: json key jq

我正在建立一个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对象

3 个答案:

答案 0 :(得分:3)

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

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

请参阅this jqplay.org片段以获取演示。如以下评论之一所确认,不需要包含_的属性键周围的引号。一些元字符(例如,属性键值中的.需要用引号".id"进行访问)需要正确地引号,但是_显然不是其中之一。

答案 1 :(得分:3)

  

我尝试了map和del的组合

好!您可能只是缺少了'| ='魔术成分:

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

答案 2 :(得分:2)

或者,您可以使用用于JSON的步行路径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片段是较大JSON的一部分(并且[KeytoSearch]无法从根寻址),则将其替换为搜索词素:<KeytoSearch>l

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