我有一个包含null
s的json文件作为某些键的值,我想用一些特定的值替换它。
鉴于此输入:
{
"id": null,
"rows": [
{
"panels": [
{
"title": "Panel1",
"datasource": null
},
{
"title": "Panel2",
"datasource": null
}
]
}
]
}
我想
{
"id": null,
"rows": [
{
"panels": [
{
"title": "Panel1",
"datasource": "mydb"
},
{
"title": "Panel2",
"datasource": "mydb"
}
]
}
]
}
我目前使用的是
sed 's/"datasource": null/"datasource": "mydb"/'
这会产生我需要的输出,但我一直认为使用sed
来完成这项工作是很遗憾的,因为像jq
这样的工具可以更好地处理JSON
答案 0 :(得分:4)
首先,您需要确定要更新的对象。由于您要将面板的null数据源设置为"mydb"
,因此您可以这样做:
$ jq '.rows[].panels[].datasource //= "mydb"' input.json
如果要更新任何级别的任何对象上的任何datasource
属性,可以使用..
递归搜索它们。
$ jq '(.. | select(objects | has("datasource"))).datasource //= "mydb"' input.json
答案 1 :(得分:0)
对于记录,将所有空值(无论它们出现在何处)的键值更改为其他值也非常容易。 jq的版本> 1.5包括jq定义的过滤器,walk / 1,也可以在其他版本的jq中使用(例如通过复制和粘贴)。
例如,要使用walk / 1将所有空值键值更改为0:
walk(if type == "object" then with_entries(.value //= 0) else . end)
这是jq提供的walk / 1的定义:
def walk(f):
. as $in
| if type == "object" then
reduce keys[] as $key
( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;
答案 2 :(得分:0)
以下解决方案使用 tostream , reduce 和 setpath 来设置值{{1}的任何叶datasource
属性1}}到null
。
"mydb"