Jackson 中出现意外字符('\'(代码 92))

bas*_*aza 6 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"}
Run Code Online (Sandbox Code Playgroud)

当我传递该值时,上面的代码运行良好jsonString

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

为了逃避我正在使用Apache StringEscapeUtils

String escapedString = StringEscapeUtils.escapeJson(jsonStirng);
Run Code Online (Sandbox Code Playgroud)

转义字符串输出

{\"Age\":40,\"Name\":\"Sample User\"}
Run Code Online (Sandbox Code Playgroud)

当我将转义字符串传递给mapper它时,会引发意外字符异常。

ObjectMapper mapper = new ObjectMapper();
mapper.readValue(escapedString,JsonNode.class);
Run Code Online (Sandbox Code Playgroud)

例外

Unexpected character ('\' (code 92)): was expecting double-quote to start field name
Run Code Online (Sandbox Code Playgroud)

实际上,我正在解析 ModSecurity 审核日志。审核日志的响应正文包含(HTML、CSS、javascript 等)内容,这就是为什么我需要转义 JSON 字符串,否则它会破坏 JSON 格式。

Pet*_*rey 5

转义字符串的目的是使其无法解析为 JSON 片段。

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

例如,这只是一个字段和值;

"myJson": "{\"Age\":40,\"Name\":\"Sample User\"}"
Run Code Online (Sandbox Code Playgroud)

您不能执行以下操作,这就是您需要此方法的原因。"它无法区分字符串的开头/结尾和"字符串内部的区别。

"myJson": "{"Age":40,"Name":"Sample User"}"
Run Code Online (Sandbox Code Playgroud)

如果您随后尝试解析这个转义字符串,它应该无法解析它。


编辑:这是一个例子

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);
Run Code Online (Sandbox Code Playgroud)

印刷

escaped= {\"Age\":40,\"Name\":\"Sample User\"}
unescaped= {"Age":40,"Name":"Sample User"}
Run Code Online (Sandbox Code Playgroud)

您可以看到转义字符串有,\"但未转义字符串没有。如果您仍然看到,\我会假设字符串尚未转义。