我有一个像这样的 json 文件:
{ "active": "secure", "secure": { "nodetype": "secure", "nodeid": null, "servers": [ "ts2.na", "ts1.na", "ts3.na" ], "stakeaddr": null, "email": null, "fqdn": null, "ipv": "4" } }
我想把它改成这样:
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nicea address",
"email": "[email protected]",
"fqdn": "itsmyfqdn",
"ipv": "4"
}
}
所以,我尝试了这个
jq '.secure.stakeaddr = "我的好地址"' config.json
虽然它给了我这个输出:
{
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
}
但是,当我 cat config.json 时,它显示最后一个未更改的文件。我也尝试使用 chmod 777 ,结果相同。我不知道我做错了什么。
答案1
jq
不进行就地编辑。
反而:
cp config.json config.json.tmp &&
jq '.secure.stakeaddr = "my nice address"' config.json.tmp >config.json &&
rm config.json.tmp
这会将文件复制到临时文件,对其应用修改(如果复制成功)并将结果重定向到原始文件名。然后删除临时文件(如果调用jq
成功)。
这会给你一个新config.json
文件,看起来像
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
"ipv": "4"
}
}
要从 shell 变量插入值:
$ fqdn='Then she said "hello"'
$ jq --arg fqdn "$fqdn" '.secure.fqdn = $fqdn' file.json
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": null,
"email": null,
"fqdn": "Then she said \"hello\"",
"ipv": "4"
}
}
也就是说,使用将into ,然后在表达式内--arg variable value
传递。请注意,这样做会value
jq
$variable
jq
正确编码值。将 shell 变量的值直接注入到表达式中不会对其值进行编码,并且可能会导致错误或格式错误的 JSON 文档。
答案2
如果您不仅限于 jq,这里有一个简单的选择 -jtc
允许就地修改。
假设您的源 json 在文件中config.json
,那么添加"stakeaddr": "my nice address"
将如下所示:
bash $ jtc -w'[secure]' -mu'{ "stakeaddr": "my nice address" }' -f config.json
bash $ cat config.json
{
"active": "secure",
"secure": {
"email": null,
"fqdn": null,
"ipv": "4",
"nodeid": null,
"nodetype": "secure",
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address"
}
}
bash $
有很多方法可以达到同样的目的。鉴于标签stakeaddr
已经存在于源 json 中,那么更好的方法是:
bash $ jtc -w'[secure][stakeaddr]' -u'"my nice address"' -f config.json
答案3
考虑到您已经python
在大多数 *nix 发行版中预安装了 ,并且包含您的数据的 json 文件名为file.json
,然后执行以下脚本
import json
from pprint import pprint
with open('file.json', 'r') as f:
jsonData = json.load(f)
pprint(jsonData)
将打印类似于以下内容的结果:
{'active': 'secure',
'secure': {'email': None,
'fqdn': None,
'ipv': '4',
'nodeid': None,
'nodetype': 'secure',
'servers': ['ts2.na', 'ts1.na', 'ts3.na'],
'stakeaddr': None}}