2012-12-11 32 views
13

私は、次のJSONを解析しようとしていると私はJsonParseExceptionを得続ける:ジャクソンJSONパーサー無効なUTF-8のスタートバイト

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

答えて

16

列33の文字はであり、これはバイト0x96の理由はファイルが物理的にWindows-1252としてエンコードされているためです。ファイルをUTF-8で保存する必要があります。windows-1252はjsonの有効なエンコードではありません。これを行う方法は、使用しているテキストエディタによって異なります。

JSON RFCを参照してください:

  1. エンコーディング

    JSONテキストはUnicodeで符号化されなければなりません。デフォルトのエンコーディングは
    UTF-8です。

+1

私はUTF-8としてJSON文字列の応答をダウンロードし、私のAndroidのSDストレージ上に.txtファイル(UTF-8)に内容を書き込み、その後、私のデスクトップにそのファイルをコピーします。 –

+0

また、Windows上でメモ帳を使用してファイルを開きます。 –

+1

このプロセスのどこかで、あなたの_believe_がUTF-8であるのは、実際にはWindows-1252です。私の推測では、オリジナルのダウンロードは誤って表示されています。ところで、0x96は "en-dash"という文字で、これはMS Wordがハイフンに使用するものです。 2番目の例では、MS Wordの特質である省略記号となっています。 –

関連する問題