jqを使用してjsonドキュメントの単一の値を更新するにはどうすればよいですか?


103

私が非常に明白な何かを見落とした場合の謝罪。私は見つけてjq、それを使用して、周囲のデータに影響を与えずに1つのJSON値を更新しようとしています。

curl結果をにパイプしjq、値を更新し、更新したJSONをにパイプしたいと思いますcurl -X PUT。何かのようなもの

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json

これまではを使用してハッキングしてきましたsedが、の|=演算子の例をいくつか見てみると、jqこれらは必要ないと確信しています。

JSONのサンプルを次に示します。JSONの残りの部分を保持しながら、どうやっjqてset を使用するの"local": falseですか?

{
  "shipping": {
    "local": true,
    "us": true,
    "us_rate": {
      "amount": "0.00",
      "currency": "USD",
      "symbol": "$"
    }
  }
}

回答:


126

=演算子を使用してオブジェクトの値を設定します。 |=一方、値を更新するために使用されます。微妙ですが重要な違いです。フィルターのコンテキストが変更されます。

プロパティを定数値に設定するので、=演算子を使用します。

.shipping.local = false

プロパティに値を設定するときに、必ずしも存在する必要はないことに注意してください。この方法で新しい値を簡単に追加できます。

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true

10
このサンプルは通常の値には適していません。したがって、通常の値を変更する必要がある場合は"、などの値を追加する必要があります.shipping.local = "new place"。したがって、コマンド全体はになりますcurl http://example.com/shipping.json | jq '.shipping.local = "new place"'。そうしないと、奇妙なエラーが発生します。
BMW

8
@BMWなに?ここはまったく問題ありません。有効なjson値はすべて有効です。これはたまたまリテラルfalseです。値は文字列である必要はありません。
ジェフメルカド2018

OPがで設定する@BMW false。どうしましたか?
SOFe

17

値を更新(.foo.barを「新しい値」に設定):

jq '.foo.bar = "new value"' file.json

変数を使用して値を更新します(.foo.barを "hello"に設定):

variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json

これを例として使用して、シェルを介してNPM package.jsonの名前を変更しました。
マチャド

2
これは実際にはファイルの内容を置き換えません。stdoutにのみ出力します。変更を持続させるには、スタウトをファイルに保存する必要があります。stackoverflow.com/a/60744617/1626687を
スパー

1

演算子| =と同様の関数がマップです。マップは、配列に対する以前のフィルターの要件を回避するのに適しています...

データが配列であると想像してください(この例では非常に一般的です)

[
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  },
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  }
]

したがって、コード内の配列を次のように考える必要があります。

http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json

または、すべての配列要素で機能するように作成されたマップ関数を使用する

http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json

観察

学習している人のために、jqの使用法にもいくつかの間違いをしました。最初のパラメーターをプログラムとして「読み取った」と考えてください。したがって、必要なすべてのコマンドは、プログラム。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.