使用Shell脚本如何将JSON对象添加到JSON文件中

29

JSON文件如下:

{"name" :"sam",
"age":23,
"designation":"doctor"}

现在我想使用Bash脚本将另一个JSON对象{"location":"canada"}添加到文件末尾。

我尝试过echo "{"location":"canada"}">>sample.json,但结果是:

{"name" :"sam",
"age":23,
"designation":"doctor"} {location:canada}

但是我希望它变成这样

{"name" :"sam",
"age":23,
"designation":"doctor", 
"location":"canada"}

请给我建议


Shell脚本不太适合这个任务。你应该尝试找到一个真正理解JSON的工具。如果你懂Python,可以看一下json.tool - tripleee
2个回答

68
要合并两个json对象,你可以使用jq命令行实用程序
$ jq -s add sample.json another.json

输出:

{
  "name": "sam",
  "age": 23,
  "designation": "doctor",
  "location": "canada"
}

更新单个属性:
$ jq '.location="canada"' sample.json

它产生相同的输出。

要在位置前添加"doctor":

$ jq '.location = "doctor" + .location' input.json

输出:

{
  "name": "sam",
  "age": 23,
  "designation": "doctor",
  "location": "doctorcanada"
}

3
我只用 jq 工作了 5 分钟,但它非常灵活。我强烈建议使用它来代替使用 ed/sed/awk 进行复杂的操作。 - Niels Bom
6
jq '.location="canada"' sample.json 是唯一有效的命令,但它并没有将数据附加到sample.json文件中,而是只将结果打印到屏幕上。我们的整个想法是要将数据附加到一个json文件中。jq -s add 命令一直报错:“parse error: Invalid numeric literal at line 3, column 32”,即使你删除 "age":23,仍然会得到“invalid numeric literal”的错误提示。你们怎么做才能使这个命令运行起来呢? - user5161995
2
@Bear:答案中的所有示例都有效(我刚在我的机器上再次检查了当前的jq版本:jq --version -> jq-1.5-1-a5b5cbe)。 所有示例都会打印到屏幕上(在您为您的情况调整过滤器时,您不希望破坏输入数据。如果您不知道如何将输出保存到文件,请询问)。 我看到有人点赞了您的评论。这是否意味着存在一个jq无法工作的环境? - jfs
为了方便起见,可以使用以下命令:jq ... INPUT > INPUT.tmp && mv INPUT.tmp INPUT。更多信息请参考此链接:https://dev59.com/aloV5IYBdhLWcg3wL8aw。 - Sida Zhou

18
sed -i '$s/}/,\n"location":"canada"}/' sample.json

结果:

{"name" :"sam",
"age":23,
"designation":"doctor",
"location":"canada"}

2
@kampu:使用 sed 和正则表达式来操作 JSON 数据是脆弱且不必要的复杂。有更好的替代方案 - jfs
@kampu:这个问题到目前为止已经被浏览了2k+次。无论OP是否表现出任何努力(你可以对问题进行投票),其他人都不应该遭受痛苦,即使你认为OP应该受到惩罚(个人而言,我宁愿完全忽略一个问题,也不愿意有意提供“次优”的答案)。 - jfs
1
仅供参考-- 如果你在Mac上运行 sed -i 命令,你会得到这个错误:"sed: 1: "sample.json": unterminated substitute pattern"。但是如果你在Linux(Ubuntu)上运行该命令,就没有问题。 - user5161995
1
有人知道如何在这个语句中使用变量吗?如果您这样做:**loc="canada"**,然后执行sed -i '$s/}/,\n"location":"$loc"}/' sample.json,它不起作用。它没有渲染变量,而是将"location":"$loc"放在了那里。 - user5161995
2
'$s/}/,\n"location":"'$loc'"}/' - perreal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接