2

我正在尝试解析一个 UTF 16 编码的 JSON 文件,但是我遇到了一个奇怪的问题。

每当我使用 aFileInputStream时,解析文件似乎都是从中点开始的。例如,如果文件长度为 40 个字符,它将从字符 20 开始。这会导致解析 JSON 时出错,因为很明显它的数据从文件中的字符 0 开始。

尽管工作了数周,但前几天还是出现了这个问题。我看不出我的代码有任何问题,因为在问题开始之前的几天里它没有改变。

我尝试的解决方法之一是切换到使用 FileReader. 它通常从字符零开始,但是它无法处理文档中的 UTF-16 字符,因此不能解决问题。

我正在使用 Google 的 Gson 库来处理 JSON,但是我认为问题出InputStreamReaderFileInputStream.

以下是有问题的代码;

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 回答