我有一个像这样的字符串,当我尝试解析它时,它会出现在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
会对此有所帮助吗?
答案 0 :(得分:2)
您的JSON数据格式不正确。
JSON使用\u
转义序列对UTF-16代码单元进行编码。
在这种情况下,您的JSON数据正在尝试转义Unicode代码点U+007F DELETE
(JSON 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)