Freemarker 模板解析器或 snakeyaml 未按预期打印 json 字符串

Freemarker template parser or snakeyaml does not print json strings as expected

我们正在尝试打印出 json 格式的字符串作为 yaml 文件中不带引号的值。我们正在使用 Freemarker 模板引擎版本 2.3.26,并使用 org.yaml.snakeyaml 库将输出转储到 yaml 文件中。

我们要么看到 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: {"key": "val"}.

第一个示例在任何版本的 FreeMarker 中打印 {"key": "val"}。所以我猜你正在显示将模板输出解析为 YAML 的结果。 (虽然 https://try.freemarker.apache.org 按原样显示模板输出。)在那种情况下,我认为它应该是:setting_a: "${a?js_string}".

此外,<#assign a = "{"key": "val"}"> 是 FreeMarker 中的语法错误,因此您不应该得到任何输出。