jq 未附加 json 文件

jq 未附加 json 文件

我有一个像这样的 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传递。请注意,这样做会valuejq$variablejq正确编码值。将 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}}

相关内容