我正在尝试解析UTF 16编码的JSON文件,但是我遇到了一个奇怪的问题。
每当我使用FileInputStream
时,解析文件似乎从中点开始。例如,如果文件长度为40个字符,则它将从字符20开始。这会导致解析JSON时出错,显然它的数据从文件中的字符0开始。
这个问题前几天出现了,尽管工作了几个星期。我可以看到我的代码没有问题,因为它在问题开始前几天没有改变。
我尝试过的一种解决方法是切换到使用FileReader
。它通常在字符零处开始,但它无法处理文档中的UTF-16字符,因此无法解决问题。
我正在使用Google的Gson库来处理JSON,但我认为问题出在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读取文件的其他方法都会受到欢迎。
答案 0 :(得分:0)
忘记在找到解决方案时更新问题。
错误来自于我手动创建JSON文件而不是以编程方式生成它。
当文件由JSONWriter类生成时,额外的元数据被添加到文件中,该文件告诉解析器它是JSON文件。手动创建的文件中缺少此元数据,因此JSONReader在解析文件时抛出错误。