设备重启后JSON文件已损坏

时间:2016-06-16 00:12:24

标签: android json

我使用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

0 个答案:

没有答案