Wie kann ich allen Elementen eines vorhandenen JSON-Arrays eine Variable hinzufügen?

Dec 08 2020

Ich habe das folgende JSON-Array aus einer JSON-Datei:

[
  {
    "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"
  }
]

und ich möchte die Variable "kritisch" mit einem bash-Befehl zu allen Elementen hinzufügen, damit es so aussieht:

[
      {
        "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"
      }
    ]

Leider bin ich ein vollständiger JSON- und Bash-Anfänger und konnte keinen Bash-Befehl finden, der dieses Problem löst. Ich habe ein bisschen mit jq auf jq-play versucht, aber es hat nicht wirklich zu etwas geführt, also wollte ich es hier versuchen. Ich hoffe, dies sind alles Informationen, die benötigt werden. Kennt jemand vielleicht einen Befehl dafür?

EDIT: Das hier hat funktioniert, danke!

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

Aber nein, ich möchte den Wert von "Ja" oder "Nein" abhängig vom Dateiwert bestimmen. Wissen Sie, wie Sie den Befehl so bearbeiten, dass er den Dateiewert überprüft, um den kritischen Wert zu ermitteln?

Es sollte so entscheiden:

Dateipfad1, Dateipfad3 führt zu "critical" : "No"

und

Dateipfad2, Dateipfad4, Dateipfad5 führt zu "critical" : "Yes"

Antworten

0stone0 Dec 08 2020 at 18:48

Sie können eine jq if-Anweisung verwenden .

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

Probieren Sie es auf jqPlay aus

peak Dec 09 2020 at 04:08

Um die Redundanz zu minimieren, können Sie Folgendes tun:

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

Oder der Kürze halber:

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