杰克逊的意外字符('\'(代码92))

时间:2016-04-15 12:05:54

标签: java json jackson

在某些情况下,在与Jackson分析JSON字符串时遇到问题。

String jsonString = "{\"Age\":40, \"Name\":\"Sample User\"}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jsonString,JsonNode.class);

System.out.println(jsonstirng)
{"Age":40, "Name":"Sample User"}

当我传递jsonString值时,上面的代码效果很好。

在某些情况下,我需要转义无效的字符串字符,例如",'

为逃避我正在使用 Apache StringEscapeUtils

String escapedString = StringEscapeUtils.escapeJson(jsonStirng);

转义字符串输出

{\"Age\":40,\"Name\":\"Sample User\"}

当我将escapedString传递给mapper时,它会抛出意外的字符异常。

ObjectMapper mapper = new ObjectMapper();
mapper.readValue(escapedString,JsonNode.class);

例外

Unexpected character ('\' (code 92)): was expecting double-quote to start field name

实际上我正在解析ModSecurity审核日志。审计日志的响应主体有(html,css,javascript等)的东西,这就是为什么我需要转义JSON字符串,否则它会破坏JSON格式。

1 个答案:

答案 0 :(得分:4)

转义String的目的是使其像JSON一样无法解析。

在您的原因中,您将所有"替换为\",以便可以在String值中使用它,并且解析器不会将其视为JSON的一部分。

e.g。这只是一个字段和值;

"myJson": "{\"Age\":40,\"Name\":\"Sample User\"}"

您可以做的是以下内容,这就是您需要此方法的原因。它无法区分开始/结束字符串的"和字符串中的"之间的区别。

"myJson": "{"Age":40,"Name":"Sample User"}"

如果您尝试解析此转义字符串,则它无法解析它。

编辑:这是一个例子

String text = "{\"Age\":40,\"Name\":\"Sample User\"}";
String escaped = StringEscapeUtils.escapeJson(text);
System.out.println("escaped= " + escaped);
String unescaped = StringEscapeUtils.unescapeJson(escaped);
System.out.println("unescaped= " + unescaped);

打印

escaped= {\"Age\":40,\"Name\":\"Sample User\"}
unescaped= {"Age":40,"Name":"Sample User"}

你可以看到转义的字符串有\"但是未转义的字符串不是。{p>如果您仍然看到\,我会认为字符串未被转义。

相关问题