Как я могу добавить переменную ко всем элементам существующего массива 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, чтобы она выглядела так:

[
      {
        "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 на jq-play, но это ни к чему не привело, поэтому я хотел попробовать здесь. Я надеюсь, что это вся необходимая информация, так что кто-нибудь знает, может быть, команду для этого?

РЕДАКТИРОВАТЬ: Это сработало, спасибо!

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

Но нет, я хочу определить значение «да» или «нет» в зависимости от значения файла. Вы знаете, как отредактировать команду, чтобы она проверяла значение файла, чтобы определить критическое значение?

Он должен решить примерно так:

Filepath1, Filepath3 ведет к "critical" : "No"

и

Filepath2, Filepath4, Filepath5 ведет к "critical" : "Yes"

Ответы

0stone0 Dec 08 2020 at 18:48

Вы можете использовать if-оператор jq ;

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