Как встроить буквальный json в YAML с помощью jsonnet?

Вот чего я пытаюсь добиться с помощью jsonnet:

version: "v1"
data:
  j.json: |-
    {
      "foo": "bar"
    }

Вот моя неудачная попытка:

local j = {
  foo: "bar"
};

local wrapper = {
  version: "v1",
  data: {
    'j.json': |||
      j
    |||
  }
};

std.manifestYamlDoc(wrapper)

В моей попытке я получаю следующий результат:

"data":
  "j.json": |
    j
"version": "v1"

Как можно добиться желаемого результата?


person Maklaus    schedule 16.10.2019    source источник


Ответы (1)


Пара вещей там:

  • многострочная строка, которую вы создаете с помощью выражения |||, является литералом, для нее потребуется оператор формата %<blah>, как и для любой другой строки.
  • похоже, вы хотите std.manifestJson() там
  • Я бы лучше воспользовался тем, что JSON является YAML, и использовал вывод jsonnet, чтобы он был более разборчивым:

foo.jsonnet:

local j = {
  foo: "bar"
};

local wrapper = {
  version: "v1",
  data: {
    'j.json': std.manifestJson(j)
  }
};

wrapper

вывод jsonnet:

$ jsonnet foo.jsonnet
{
   "data": {
      "j.json": "{\n    \"foo\": \"bar\"\n}"
   },
   "version": "v1"
}

проверка поля j.json с помощью jq

$ jsonnet foo.jsonnet | jq -r '.data["j.json"]' | jq
{
  "foo": "bar"
}
person jjo    schedule 16.10.2019