我们使用Freemarker将一个JSON转换为另一个JSON。
{"k1": "a", "k2":"line1. \n line2"}
使用Freemarker模板发布,JSON将转换为:
{ \n\n "p1": "a", \n\n "p2": "line1. \n line2"}
下面是我们用于执行转换的逻辑
final Map<String, Object> input = JsonConverter.convertFromJson(input, Map.class);
final Template template = freeMarkerConfiguration.getTemplate("Template1.ftl");
final Writer out = new StringWriter();
template.process(input, out);
out.flush();
final String newlineFilteredResult = new JSONObject(out.toString).toString();
由于键k2的字符串中包含换行符,因此无法转换为JSON对象,并出现以下异常:
Caused by: org.json.JSONException: Unterminated string at ...
我尝试使用以下方法,但没有任何效果:
- JSONObject.quote
- JSONValue.escape
3.(“[\n\r]+",“\n”);
由于开头的换行符,我也遇到了以下异常:
Caused by: org.json.JSONException: Missing value at 1 [character 2 line 1]
有人能给我指一下正确的方向吗?
2条答案
按热度按时间fnvucqvd1#
编辑
OP进一步澄清后,他在freemarker模板中使用了
"${key}": "${value}"
,${value}
可能包含线路制动器。这种情况下的解决方案是使用${value?json_string}
。fumotvh32#
从FreeMarker 2.3.32开始,您可以编写
"${key}": ${value?c}
而不是"${key}": "${value}"
,因为如果?c
的左边是字符串,现在它不会失败,而是用括起来并转义字符串。因此,您甚至不必知道左边是否是数字/布尔值,它不能用引号括起来(?c
不会将它们括起来),或者是字符串,因为它是自动的,所以必须用引号括起来。此外,如果已知左值有时缺失/
null
,则?cn
将通过打印null
文字来处理这种情况。此外,请检查
c_format
设置以获得最佳结果,但默认情况下字符串格式是JSON兼容的,因此即使没有设置,使用?c
也会有所改进。