#json #jq
Вопрос:
Я хотел бы заполнить json-data.json
объекты данных json с помощью a json-template.json
.
Пример:
json-data.json
:
[ {name: "John", familyName: "Smith"}, {name: "Samuel", familyName: "Schnaider"} ]
И мой json-template.json
:
{ key1: "value1", key2: "value2", name: "XXX", familyName: "YYY" }
Мой желаемый результат был бы:
[ { key1: "value1", key2: "value2", name: "John", familyName: "Smith" }, { key1: "value1", key2: "value2", name: "Samuel", familyName: "Schnaider" } ]
Есть какие-нибудь идеи о том, как его использовать jq
?
Ответ №1:
Для простоты, поскольку вы указали, что json-data.json содержит JSON, давайте предположим, что он содержит допустимый JSON.
Вероятно, было бы также проще, если бы шаблон был действительным JSON, но в случае, если вы застряли с шаблонами, подобными тому, который вы показали, давайте продолжим с этим.
Поскольку показанный шаблон не является допустимым JSON, но допустим в качестве спецификации объекта jq, давайте начнем с предположения, что мы можем сделать его частью программы jq, например, путем
def template: { key1: "value1", key2: "value2", name: "XXX", familyName: "YYY" } ;
Теперь нам осталось только написать фильтр для преобразования входного объекта в форму, указанную шаблоном:
def fillin($template): . as $in | reduce ($template|keys_unsorted[]) as $k ($template; if $in|has($k) then .[$k] = $in[$k] else . end);
С вашим участием нам остается только позвонить:
map(fillin(template))
Поместив весь код jq в один файл, вызов будет выглядеть следующим образом:
jq -f populate-template.jq json-data.json
Комментарии:
1. Я пропустил, чтобы написать это —gt; Как насчет того, что мне нужно будет переехать gt;
name
вpatient.name
?2. Не уверен, что именно вы имеете в виду, но это было бы либо очень легко, либо тривиально легко. Если вы не можете понять это, то, пожалуйста, будьте более конкретны, при необходимости открывая новый SO Q.
Ответ №2:
Если шаблон потенциально недействителен как JSON и если вы хотите сохранить его в отдельном файле, то, предполагая оболочку bash или подобную bash, вы можете написать:
lt; json-data.json jq --argfile t lt;(jq -n -f template.txt) ' def fillin($template): . as $in | reduce ($template|keys_unsorted[]) as $k ($template; if $in|has($k) then .[$k] = $in[$k] else . end); map(fillin($t)) '