2012-12-11 31 views
13

Tôi đang cố gắng để phân tích JSON sau và tôi tiếp tục nhận được một JsonParseException:Jackson JSON phân tích cú pháp hợp lệ utf-8 bắt đầu byte

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

cũng thất bại trên ... trong JSON này

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

Ngoại lệ:

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) 

Code:

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(); 
     } 
    } 
} 

Trả lời

16

Ký tự ở cột 33 là và lý do này là byte 0x96 là tệp được mã hóa vật lý dưới dạng Windows-1252. Bạn cần lưu tệp trong UTF-8, windows-1252 không phải là mã hóa hợp lệ cho json. Làm thế nào để làm điều này phụ thuộc vào trình soạn thảo văn bản bạn đang sử dụng.

Xem JSON RFC:

  1. Encoding

    JSON văn bản được mã hóa trong Unicode. Mã hóa mặc định là
    UTF-8.

+1

tôi tải về một chuỗi phản ứng JSON như UTF-8 và viết nội dung vào một tập tin .txt (UTF-8) vào lưu trữ SD Android của tôi và sau đó sao chép file đó vào máy tính để bàn của tôi. –

+0

Ngoài ra tôi đang sử dụng notepad trên Windows để mở tệp. –

+1

Một nơi nào đó trong quá trình, những gì bạn biết là UTF-8 thực sự là Windows-1252. Đoán của tôi là bản tải xuống ban đầu bị gắn nhãn sai. BTW, 0x96 là ký tự "en-dấu gạch ngang", đó là những gì MS Word sử dụng cho dấu nối. Trong ví dụ thứ hai, thủ phạm là ký tự dấu chấm lửng, cũng là một đặc điểm riêng của MS Word. –

Các vấn đề liên quan