我使用JSON持久化对象。当我创建一些对象,退出并重新启动应用程序时,正确读取文件并按预期反序列化对象。但是,如果我在创建对象后重新启动设备并尝试重新启动应用程序,则JSON文件已损坏且应用程序崩溃。使用调试器,我看到读者只读取 字符。如果我进入应用信息并重置数据,则应用会正确启动。
我正在将我的对象的实例转换为JSONObjects
并将其存储到JSONArray
中,然后将其toString()
值写入文件:
public final void saveItems(@NonNull List<T> items) throws IOException {
JSONArray array = new JSONArray();
try {
for (T item : items) {
array.put(item.toJsonObject());
}
} catch (JSONException e) {
throw new RuntimeException(e);
}
OutputStreamWriter writer = null;
try {
writer = new OutputStreamWriter(mContext.openFileOutput(mFilename, Context.MODE_PRIVATE));
writer.write(array.toString());
} finally {
if (writer != null) {
writer.close();
}
}
}
这就是我阅读文件的方式:
public final List<T> loadItems() throws IOException {
ArrayList<T> items = new ArrayList<>();
BufferedReader reader = null;
try {
InputStream in = mContext.openFileInput(mFilename);
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder jsonString = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonString.append(line);
}
// Crashes here!
JSONArray array = (JSONArray) new JSONTokener(jsonString.toString()).nextValue();
for (int i = 0; i < array.length(); i++) {
items.add(newItem(array.getJSONObject(i)));
}
} catch (JSONException e) {
throw new RuntimeException(e);
} finally {
if (reader != null)
reader.close();
}
return items;
}
读者只读取 s,因此jsonString.toString()
的值不是正确的JSON数组字符串,我收到此错误:
java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONArray