【问题标题】:Unexpected character ('\' (code 92)) in jackson杰克逊中的意外字符('\'(代码 92))
【发布时间】:2016-04-15 12:05:54
【问题描述】:

在某些情况下使用 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 格式。

【问题讨论】:

  • 你为什么要转义该字符串中的引号?真正的 Json 字符串中不应有转义符。打印您在第一行中的jsonString,您会看到它在内部没有任何转义。
  • 该问题的描述非常混乱,甚至无法编译,并且转义会神奇地将年龄从 40 更改为 33。请检查并显示真实代码。但我只能假设您引用了错误的内容。
  • @kan 拼写错误。现在正在更新它,请看看。
  • 你不应该转义 json 字符串本身,你只需要转义将作为 json 格式文档的值放置的原始字符串。
  • 根据问题的最后一行,您需要转义“东西”,而不是 JSON。

标签: java json jackson


【解决方案1】:

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

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

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

"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"}

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

【讨论】:

  • 其实是在用jackson解析ModSecurity审计日志。我也得到了响应头和响应体。响应正文包含(html、css、javascript 等)内容,这就是为什么我需要转义 json 字符串,否则它会破坏 json 格式。
  • @basitraza 同意,转义是为了安全地将字符串放入值中。要解析这样的字符串,您必须首先取消转义以反转它的作用。注意:转义字符串的方法不止一种,所以最好使用匹配的 unescape
  • 您在这种情况下的建议。我尝试了不同的转义模式,但没有任何改变。转义单引号 ` ' ` 在某些情况下有效,但并非全部有效。
  • @basitraza 您应该能够在 String 上调用 escape 并将其用作值,在提取值时您必须调用 unescape。这对哪个角色不起作用?
  • 我在解析之前没有转义,但是杰克逊对象映射器抛出意外的字符异常,实际上由于无效字符,它已经损坏了 json 字符串
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多