我正在建立一个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对象
答案 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
工具的创建者