我正在使用freemarker模板将JSON转换为XML。它工作正常,除非输入json包含一些unicode符号。
直到现在我遇到了en-dash和em-dash,FTL转换失败了:
lexical error: encountered "u" (117)
当我对变量使用?eval操作时模板失败。
我正在使用freemarker v2.3.28,我已将编码设置为UTF-8。
P.S。我检查过版权和商标符号是否正常工作。
答案 0 :(得分:2)
问题当然是这些字符在源JSON中被转义为\uXXXX
,但FTL字符串语法没有\u
转义。 ?eval
将其输入解释为FTL表达式,而不是JSON表达式。它们恰好相似,但存在差异。 (顺便说一句,据我所知,en-dash和em-dash不需要用JSON转义,类似于版权,但当然它可以逃脱任何角色。)
怎么办? FreeMarker-ish方法是将JSON添加到已经解析为Map
- s(或Java bean)和List
- s等的数据模型中。模板并不意味着解析输入。如果这不可行,那么您可以将自定义方法添加到数据模型(可能作为Configuration
级别的共享变量)进行真正的JSON解析,然后将其称为{{1 }}
无论如何,用例是什么?在模板中解析JSON的愿望常常出现在SO上。如果用例有效,也许下一个FreeMarker版本应该有eval_json(x)
。
答案 1 :(得分:0)
首先通过将所有unicode替换为html实体来预处理变量。
replaceAll("\\\\u(....)", "&#x$1;")
答案 2 :(得分:0)
根据关于 Expressions 的手册,您应该使用 "\uHHHH"
代替 "\xHHHH"
(x 而不是 u),其中 HHHH 是代表 {{3}} 的一到四个十六进制数字。