2

UTF 16 でエンコードされた JSON ファイルを解析しようとしていますが、奇妙な問題に遭遇しました。

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

この問題は、数週間作業したにもかかわらず、先日発生しました。問題が発生するまでの数日間はコードが変更されていなかったため、コードに問題はありません。

私が試みた回避策の 1 つは、 FileReader. 通常は文字 0 から始まりますが、ドキュメント内の 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();
...

元の問題の修正であろうと、UTF-16としてファイルを読み込む別の方法であろうと、解決策は大歓迎です。

4

1 に答える 1

0

解決策を見つけたときに質問を更新するのを忘れました。

このエラーは、JSON ファイルをプログラムで生成するのではなく、手動で作成したために発生しました。

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

于 2012-04-17T09:15:41.377 に答える