Jak mogę dodać zmienną do wszystkich elementów istniejącej tablicy JSON?

Dec 08 2020

Mam następującą tablicę JSON z pliku 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"
  }
]

i chcę dodać zmienną „krytyczna” do wszystkich jej elementów za pomocą polecenia bash, aby wyglądała następująco:

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

Niestety jestem kompletnym początkującym użytkownikiem JSON i bash i nie mogłem znaleźć polecenia bash rozwiązującego ten problem. Trochę próbowałem z jq na jq-play, ale tak naprawdę do czegoś nie doprowadziło, więc chciałem spróbować tutaj. Mam nadzieję, że to wszystkie potrzebne informacje, więc czy ktoś zna może polecenie do tego?

EDYCJA: To tutaj zadziałało, dzięki!

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

Ale nie, chcę określić wartość „tak” lub „nie” w zależności od wartości pliku. Czy wiesz, jak edytować polecenie, aby sprawdzało wartość pliku w celu określenia wartości krytycznej?

Powinien zdecydować w ten sposób:

Filepath1, Filepath3 prowadzi do "critical" : "No"

i

Filepath2, Filepath4, Filepath5 prowadzi do "critical" : "Yes"

Odpowiedzi

0stone0 Dec 08 2020 at 18:48

Możesz użyć instrukcji if-jq ;

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

Wypróbuj na jqPlay

peak Dec 09 2020 at 04:08

Aby zminimalizować nadmiarowość, możesz skorzystać z:

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

Lub dla zwięzłości:

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