Анализатор шаблонов Freemarker или snakeyaml не печатает строки json, как ожидалось

#json #templates #yaml #freemarker #snakeyaml

#json #шаблоны #yaml #freemarker #snakeyaml

Вопрос:

Мы пытаемся распечатать строку в формате json в качестве значения для файла yaml без кавычек. Мы используем движок шаблонов Freemarker версии 2.3.26 и выгружаем выходные данные в файлы yaml с помощью org.yaml.snakeyaml библиотеки.

Мы либо видим json, преобразованный в yaml, либо json, заключенный в одинарные кавычки; хотя https://try.freemarker.apache.org кажется, это возможно.

Ниже приведены несколько примеров с фрагментом кода и соответствующим выводом:

 <#assign a = '{"key": "val"}'>
setting_a: ${a?string}
  

печатает (без кавычек)

 string_a:
  key: val
  

 <#assign a = '{"key": "val"}'>
setting_a: ${a?js_string}
  

печатает (с кавычками и экранированием)

 setting_a:
  "key": "val"
  

 <#assign a = "{"key": "val"}">
setting_a: ${a?json_string}
  

печатает (с кавычками и экранированием)

 setting_a:
  "key": "val"
  

 <#assign a = "{"key": "val"}">
setting_a: ${a?string}
  

печатает (без кавычек)

 setting_a:
    key: val
  

 <#assign a = "{"key": "val"}">
setting_a: ${a?js_string}
  

печатает (с кавычками и экранированием)

 setting_a:
  "key": "val"
  

 <#assign a = "{"key": "val"}">
setting_a: ${a?json_string}
  

печатает (с кавычками и экранированием

 setting_a:
  "key": "val"
  

Мы ожидаем, что выходной yaml файл является

setting_a: {«ключ»: «значение»}.

  • Возможно ли это?
  • Если да, нужно ли нам выбирать конкретные org.yaml.snakeyaml.DumperOptions для этого?
  • Если это невозможно, мне интересно, выбираю ли я неправильные параметры наhttps://try.freemarker.apache.org /

Комментарии:

1. В чем проблема с первым выводом? Какой результат вы ожидаете вместо этого?

2. Кроме того, некоторые из более поздних примеров не выглядят реальными, поскольку они были бы синтаксическими ошибками FreeMarker, но вы показываете выходные данные для них.

3. Ожидаемый результат: setting_a: {"key": "val"}. (без внешних кавычек вокруг значения). Нам интересно, возможно ли это вообще, если мы используем шаблон Freemarker, за которым следует snakeyaml для выгрузки выходных данных в yaml и ожидаем, что в качестве выходных данных будет указана строка выше.

4. Из выходных данных видно, что выходные данные обрабатываются как YAML, а затем печатаются в некоторой канонической форме (поэтому они переформатированы). Таким образом, исходный синтаксис теряется, но значение остается прежним. Итак, почему вас это волнует? Значение первого вывода совпадает со значением setting_a: {"key": "val"} .

5. Да, в идеале нам должно быть все равно (если это json или yaml, если смысл не потерян). Пользователь параметра ожидает, что это будет json. Сказал, что чем больше я думаю об этом — это звучит как необоснованный запрос, ожидающий json правильного анализа внутри файла yaml. Что вы думаете?

Ответ №1:

Первый пример печатается {"key": "val"} в любой версии FreeMarker. Итак, я предполагаю, что вы показываете результат анализа выходных данных шаблона как YAML. (В то время какhttps://try.freemarker.apache.org показывает вывод шаблона как есть.) В таком случае, я думаю, это должно быть: setting_a: "${a?js_string}" .

Кроме того, <#assign a = "{"key": "val"}"> это синтаксическая ошибка во FreeMarker, и поэтому вы не должны получать никаких выходных данных.

Комментарии:

1. Спасибо, что вернулись. Да, я думаю, это неясно из вопроса; но мы используем org.yaml.snakeyaml библиотеку для чтения выходных данных и выгрузки их в файл yaml. Учитывая это, возможно ли получить желаемый результат с помощью org.yaml.snakeyaml.DumperOptions ? Я соответствующим образом обновил вопрос