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,
    }

ただし、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"
  }
}

シェル変数から値を挿入するには:

$ 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"
  }
}

つまり、will intoを使用して式内で渡します--arg variable value。そうすればvaluejq$variablejq正しくエンコードされた値。シェル変数の値を式に直接挿入すると、その値はエンコードされず、エラーや誤ったJSON文書が発生する可能性があります。

答え2

jqに限定されない場合は、簡単なオプションがあります。jtc内部修正を許可します。

ソースjsonがfileにあると仮定すると、追加は次の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

ほとんどの*nixディストリビューションにpythonすでにプリインストールされていて、データを含む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}}

関連情報