Я пытаюсь изменить вложенные объекты JSON с помощью функции jq <map>
в сценарии bash/shell; что-то похожее на this blog entry, но попытка адаптировать примеры здесь к вложенным объектам.Изменить вложенный JSON с помощью jq
Возвращенный JSON должен быть изменен следующим образом:
{
"name": "vendor-module",
"dependencies": {
"abc": {
"from": "[email protected]",
"resolved": "https://some.special.url",
"version": "2.4.0"
},
"acme": {
"from": "[email protected]",
"resolved": "<CHANGE_THIS>",
"version": "1.2.3"
}
}
}
Это будет моя попытка:
modules="`node -pe 'JSON.parse(process.argv[1]).dependencies.$dependency' \
"$(cat $wrapped)"`"
version="1.2.3"
resolved="some_url"
cat OLD.json |
jq 'to_entries |
map(if .dependencies[0].$module[0].from == "[email protected]$version"
then . + {"resolved"}={"$resolved"}
else .
end
) |
from_entries' > NEW.json
Очевидно, что это не работает. Когда я запускаю сценарий, создается NEW.json
, но без изменений или возвращенных ошибок. Если я не нацелен на вложенный объект (например, "name": "vendor-module"
), сценарий работает так, как ожидалось. Я уверен, что есть способ сделать это, используя собственные bash и jq .. ?? Любая помощь (с надлежащим побегом) будет с благодарностью оценена.
UPDATE:
Thnx с помощью Charles Duffy's answer, и его предложение использовать sponge
, Решение, которое работает хорошо для меня:
jq --arg mod "acme" --arg resolved "Some URL" \
'.dependencies[$mod].resolved |= $resolved' \
OLD.json | sponge OLD.json
Нужна запятая после «из» для «acme», чтобы это было верно JSON, кстати. –
Waitaminute. У вас есть 'modules' в ваших входных переменных - если вы уже знаете, что вам нужно изменить' acme', а не 'abc', зачем вообще искать' from' и 'version'? –
Typo - Thnx. Я быстро напечатал это в качестве примера - я не хотел загрязнять этот вопрос кучей не относящегося к делу кода. – CelticParser