JSON对象中的转义字符串

tzdcorbm  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(210)

我们使用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 ...

我尝试使用以下方法,但没有任何效果:

  1. JSONObject.quote
  2. JSONValue.escape
    3.(“[\n\r]+",“\n”);
    由于开头的换行符,我也遇到了以下异常:
Caused by: org.json.JSONException: Missing value at 1 [character 2 line 1]

有人能给我指一下正确的方向吗?

fnvucqvd

fnvucqvd1#

编辑

OP进一步澄清后,他在freemarker模板中使用了"${key}": "${value}"${value}可能包含线路制动器。这种情况下的解决方案是使用${value?json_string}

fumotvh3

fumotvh32#

从FreeMarker 2.3.32开始,您可以编写"${key}": ${value?c}而不是"${key}": "${value}",因为如果?c的左边是字符串,现在它不会失败,而是用括起来并转义字符串。因此,您甚至不必知道左边是否是数字/布尔值,它不能用引号括起来(?c不会将它们括起来),或者是字符串,因为它是自动的,所以必须用引号括起来。
此外,如果已知左值有时缺失/null,则?cn将通过打印null文字来处理这种情况。
此外,请检查c_format设置以获得最佳结果,但默认情况下字符串格式是JSON兼容的,因此即使没有设置,使用?c也会有所改进。

相关问题