2012-02-17 5 views
2

UTF16でエンコードされたJSONファイルを解析しようとしていますが、奇妙な問題が発生しました。InputStreamReader、FileInputStreamは、始まりではなく中点でファイルの解析を開始します

私がFileInputStreamを使用するときはいつも、ファイルの解析は中点から始まるようです。たとえば、ファイルの長さが40文字の場合、文字20から始まります。これは、JSONの解析でエラーが発生します。これは、データがファイルの文字0から始まるためです。

数週間働いていたにもかかわらず、この問題は前日に崩壊しました。問題が始まるまでの間に変更されていないので、私のコードには問題は見られません。

私の試みた回避策の1つは、FileReaderを使用するように切り替えることでした。通常は文字ゼロで開始されますが、文書内のUTF-16文字は処理できないため、問題は解決しません。

私はJSONを処理するためにGoogleのGsonライブラリを使用していますが、この問題はInputStreamReader、またはFileInputStreamのどこかにあると思います。

以下は問題のコードです。

JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file), "UTF-16")); 
reader.beginArray(); 
... 

ここではエラーが発生します。上記のreader.beginArray();行で例外が発生します。

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 21 
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:337) 
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:304) 
    at reader.ProofDatabase.load(ProofDatabase.java:130) 
    ... 

そしてここでは、UTF16文字列を処理していない私の部分的な回避策

JsonReader reader = new JsonReader(new FileReader(file)); 
reader.beginArray(); 
... 

どれソリューションであり、それは元の問題への修正、またはUTF16としてファイルを読み込む別の方法であること歓迎する以上のものです。

+0

JSONファイルはバイトオーダーマーカーで始まりますか?どのように生成されますか? – Joni

+0

私が現在使用しているファイルは手作業で作成されました。手動で有効なjsonを入力したときと同じです。前のファイルは、gsonライブラリの 'JsonWriter'クラスを使って生成されました。 –

+0

どのエディターを使用しましたか? – Joni

答えて

0

解決策を見つけたら質問を更新しません。

エラーは、プログラムで生成するのではなく、手動でJSONファイルを作成したことが原因です。

ファイルがJSONWriterクラスによって生成されたとき、パーサーにJSONファイルであることを伝えたファイルに追加のメタデータが追加されました。このメタデータは手動で作成されたファイルでは見つからなかったため、JSONReaderはファイルの解析中にエラーをスローしていました。

関連する問題