解析JSON

时间:2015-06-24 00:02:34

标签: java json parsing unicode jackson

我有一个像这样的字符串,当我尝试解析它时,它会出现在JSON processing data call\\U007fabc computers中,杰克逊会抛出这样的异常:

org.codehaus.jackson.JsonParseException: Unrecognized character escape 'U' (code 85)
 at [Source: java.io.StringReader@1b43c429; line: 1, column: 361]
        at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1292)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._handleUnrecognizedCharacterEscape(JsonParserMinimalBase.java:360)
        at org.codehaus.jackson.impl.ReaderBasedParser._decodeEscaped(ReaderBasedParser.java:1064)
        at org.codehaus.jackson.impl.ReaderBasedParser._finishString2(ReaderBasedParser.java:785)
        at org.codehaus.jackson.impl.ReaderBasedParser._finishString(ReaderBasedParser.java:762)

我认为问题正在发生,因为\\U007f。它绝对意味着UTF-8。知道如何避免这个问题吗? JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER会对此有所帮助吗?

2 个答案:

答案 0 :(得分:2)

您的JSON数据格式不正确。

JSON使用\u转义序列对UTF-16代码单元进行编码。

在这种情况下,您的JSON数据正在尝试转义Unicode代码点U+007F DELETEJSON spec要转义的 的ASCII控制字符,但允许被转义),但正在使用\U转义序列来执行此操作。 JSON spec明确指出必须使用\u

  

字符串是用引号(U + 0022)包装的Unicode代码点序列。所有字符都可以放在引号中,但必须转义的字符除外:引号(U + 0022),反向固定(U + 005C)和控制字符U + 0000到U + 001F 。某些字符有两个字符的转义序列表示。

     

...

     

任何代码点都可以表示为十六进制数。这种数字的含义由ISO / IEC 10646确定。如果代码点在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为六个字符的序列:反向固相, 后跟小写字母u ,后跟四个编码代码点的十六进制数字。

     

...

     

要转义不在基本多语种平面中的代码点,该字符表示为十二个字符的序列,编码UTF-16代理项对。

虽然在最后一段中没有明确说明,但UTF-16代理对的12个字符序列由两个六字符序列组成,这两个序列必须遵循与BMP中字符相同的转义格式。这由字符编码图强制执行:

diagram http://www.json.org/string.gif

没有定义\U转义序列。这就是解析器错误消息抱怨的内容:

  

无法识别的角色转义'U'

答案 1 :(得分:1)

Unicode字符U+007F DELETE可能就是您所面临的。

This answer表示它不应该被编码。

但是要规避,你可以参考this answer关于如何剥离它们。