既存のJSON配列のすべてのアイテムに変数を追加するにはどうすればよいですか?

Dec 08 2020

jsonファイルから次のJSON配列があります。

[
  {
    "key": "Ley1",
    "file": "Filepath1",
    "line": 10,
    "rule": "csharpsquid:S1643",
    "message": "Use a StringBuilder instead.",
    "type": "CODE_SMELL"
  },
  {
    "key": "Key2",
    "file": "FilePath2",
    "line": 12,
    "rule": "csharpsquid:S1643",
    "message": "Use a StringBuilder instead.",
    "type": "CODE_SMELL"
  }
]

そして、bashコマンドを使用して変数「critical」をそのすべての項目に追加したいので、次のようになります。

[
      {
        "key": "Key1",
        "file": "Filepath1",
        "line": 10,
        "rule": "csharpsquid:S1643",
        "message": "Use a StringBuilder instead.",
        "type": "CODE_SMELL",
        "critical": "No"
      },
      {
        "key": "Key2",
        "file": "FilePath2",
        "line": 12,
        "rule": "csharpsquid:S1643",
        "message": "Use a StringBuilder instead.",
        "type": "CODE_SMELL",
        "critical": "Yes"
      }
    ]

残念ながら、私は完全なJSONおよびbashの初心者であり、この問題を解決するbashコマンドを見つけることができませんでした。jq-playでjqを使って少し試してみましたが、実際には何も起こらなかったので、ここで試してみたかったのです。これがすべて必要な情報であることを願っています、それで誰かがおそらくこれのためのコマンドを知っていますか?

編集:これはここでうまくいきました、ありがとう!

.[] |= . + {"critical": "No"}

しかし、ファイルの値に応じて「yes」または「no」の値を決定したくありません。臨界値を決定するためにファイル値をチェックするようにコマンドを編集する方法を知っていますか?

次のように決定する必要があります。

Filepath1、Filepath3は "critical" : "No"

そして

Filepath2、Filepath4、Filepath5は "critical" : "Yes"

回答

0stone0 Dec 08 2020 at 18:48

jqif-statement ;を使用できます。

jq '.[] |= . + {"critical": (if .file == "FilePath1" or .file == "FilePath3" then "no" else "yes" end)}'

jqPlayでお試しください

peak Dec 09 2020 at 04:08

冗長性を最小限に抑えるには、次の方法を使用できます。

map(. + {critical: (if .file | IN("FilePath1", "FilePath3") then "no" else "yes" end) })

または簡潔にするために:

map(. + {critical: ((.file | select(IN("FilePath1", "FilePath3")) | "no") // "yes" )})