вставить файл JSON в JSON - PullRequest
       8

вставить файл JSON в JSON

0 голосов
/ 10 октября 2018

Я хотел бы знать быстрый способ вставить JSON в JSON.

$ cat source.json

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": ""
        },
        {
          "name": "SERVICE_PORT",
          "value": "4321"
        }
      ]
    }
  ]
}

SERVICE_MANIFEST - это содержимое другого файла json

$ cat service_manifest.json

{
  "connections": {
    "port": "1234"
  },
  "name": "foo"
}

Я пытаюсь сделать это с помощью команды jq

cat service_manifest.json |jq --arg SERVICE_MANIFEST - < source.json

Но, похоже, это не работает

Есть идеи?Окончательным результатом должен быть действительный файл json

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": {
            "connections": {
              "port": "1234"
            },
            "name": "foo"
          }
        },
        ...
      ]
    }
  ],
  ...
}

Updates.

Спасибо, вот команда, которую я запускаю из вашего примера.

$ jq--slurpfile sm service_manifest.json '.containerDefinitions []. environment [] | = (select (.name == "SERVICE_MANIFEST"). value = $ sm)' source.json

НоРезультатом является массив, а не список.

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": [
            {
              "connections": {
                "port": "1234"
              },
              "name": "foo"
            }
          ]
        },
        {
          "name": "SERVICE_PORT",
          "value": "4321"
        }
      ]
    }
  ]
}

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Простое решение будет использовать --argfile и избегать select:

< source.json jq --argfile sm service_manifest.json '
  .containerDefinitions[0].environment[0].value = $sm ' 

Или, если вы хотите только обновить объект (ы) с .name == "SERVICE_MANIFEST", вы можете использовать фильтр:

.containerDefinitions[].environment 
  |= map(if .name == "SERVICE_MANIFEST"
         then .value = $sm 
         else . end)

Вариации

Нет необходимости в каком-либо параметре "--arg", как показано ниже:

jq -s '.[1] as $sm
  | .[0] | .containerDefinitions[0].environment[0].value = $sm
' source.json service_manifest.json
0 голосов
/ 10 октября 2018

Вы можете попробовать эту команду jq:

jq --slurpfile sm SERVICE_MANIFEST '.containerDefinitions[].environment[] |= (select(.name=="SERVICE_MANIFEST").value=$sm[])' file

--slurpfile назначает содержимое файла переменной sm

Фильтр заменяет массив .containerDefinitions[].environment[]с содержимым файла только для элемента, имеющего SERVICE_MANIFEST как name.

...