Jackson JSON 解析器无效的 utf-8 起始字节

Posted

技术标签:

【中文标题】Jackson JSON 解析器无效的 utf-8 起始字节【英文标题】:Jackson JSON parser invalid utf-8 start byte 【发布时间】:2012-11-29 14:26:12 【问题描述】:

我正在尝试解析以下 JSON,但我不断收到 JsonParseException:


   "episodes":
      "description":"Episode 3 – Oprah's Surprise Patrol from 1\/20\/04\nTake a trip down memory lane and hear all your favorite episodes of The Oprah Winfrey Show from the last 25 seasons -- everyday on your radio!"
   

在这个 JSON 中的 ... 上也失败了


   "episodes":
      "description":"After 20 years in sports talk…he’s still the top dog!  Catch Christopher “Mad Dog” Russo weekday afternoons on Mad Dog Radio as he tells it like it is…Give the Doggie a call at 888-623-3646."
   

例外:

org.codehaus.jackson.JsonParseException: Invalid UTF-8 start byte 0x96
 at [Source: C:\Json Test Files\episodes.txt; line: 3, column: 33]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
    at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidInitial(Utf8StreamParser.java:2236)
    at org.codehaus.jackson.impl.Utf8StreamParser._reportInvalidChar(Utf8StreamParser.java:2230)
    at org.codehaus.jackson.impl.Utf8StreamParser._finishString2(Utf8StreamParser.java:1467)
    at org.codehaus.jackson.impl.Utf8StreamParser._finishString(Utf8StreamParser.java:1394)
    at org.codehaus.jackson.impl.Utf8StreamParser.getText(Utf8StreamParser.java:113)
    at com.niveus.jackson.Main.parseEpisodes(Main.java:37)
    at com.niveus.jackson.Main.main(Main.java:13)

代码:

public class Main 
    public static void main(String [] args) 
        parseEpisodes("C:\\Json Test Files\\episodes.txt");
    
    public static void parseEpisodes(String filename) 
        JsonFactory factory = new JsonFactory();
        JsonParser parser = null;
        String nameField = null;

        try 
            parser = factory.createJsonParser(new File(filename));

            parser.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
            parser.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);

            JsonToken token = parser.nextToken();
            nameField = parser.getText();
            String desc = null;

            while (token != JsonToken.END_OBJECT) 
                if (nameField.equals("episodes")) 
                    while (token != JsonToken.END_OBJECT) 
                        if (nameField.equals("description")) 
                            parser.nextToken();
                            desc = parser.getText();
                        

                        token = parser.nextToken();
                        nameField = parser.getText();
                    
                

                token = parser.nextToken();
                nameField = parser.getText();
            

            System.out.println(desc);
        
        catch (JsonParseException e) 
            e.printStackTrace();
        
        catch (IOException e) 
            e.printStackTrace();
        
    

【问题讨论】:

【参考方案1】:

第 33 列的字符是 ,这将是字节 0x96 的原因是文件被物理编码为 Windows-1252。您需要将文件保存为 UTF-8,windows-1252 不是 json 的有效编码。如何执行此操作取决于您使用的文本编辑器。

见JSON RFC:

    编码

    JSON 文本应以 Unicode 编码。默认编码是 UTF-8。

【讨论】:

我以 UTF-8 格式下载 JSON 字符串响应,并将内容写入我的 android SD 存储中的 .txt 文件 (UTF-8),然后将该文件复制到我的桌面。 我也在 Windows 上使用记事本打开文件。 在过程中的某个地方,您相信的是 UTF-8 实际上是 Windows-1252。我的猜测是原始下载被贴错标签。顺便说一句,0x96 是字符“破折号”,这是 MS Word 用于连字符的字符。在第二个示例中,罪魁祸首是省略号字符,也是 MS Word 的特点。 @AndroidNoob 字节 0x96 永远不会单独出现在 utf-8 编码文件中,因为它是一个延续字节。在记事本中打开文件,按另存为,然后从编码菜单中选择UTF-8【参考方案2】:

我也遇到过类似的问题。在记事本++中打开你的json,然后在编码下拉菜单中选择UTF-8。并将文本保存到其他文件。这样做解决了这个问题。

【讨论】:

以上是关于Jackson JSON 解析器无效的 utf-8 起始字节的主要内容,如果未能解决你的问题,请参考以下文章

JSON:Jackson 流解析器——真的值得吗? [关闭]

Jackson解析Json

Android - Jackson JSON 解析器在“发布”版本中返回空值

spring boot2 修改默认json解析器Jackson为fastjson

Jackson的高级应用(转)

定制 Jackson 解析器来完成对复杂格式 XML 的解析