jq: заполнение шаблона json

#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)) '