Как я могу добавить переменную ко всем элементам существующего массива JSON?
У меня есть следующий 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"
Ответы
Вы можете использовать if-оператор jq ;
jq '.[] |= . + {"critical": (if .file == "FilePath1" or .file == "FilePath3" then "no" else "yes" end)}'
Попробуйте на jqPlay
Чтобы минимизировать избыточность, вы можете использовать:
map(. + {critical: (if .file | IN("FilePath1", "FilePath3") then "no" else "yes" end) })
Или для краткости:
map(. + {critical: ((.file | select(IN("FilePath1", "FilePath3")) | "no") // "yes" )})