修改内部存储JSON数组单值时其余对象丢失的问题排查
问题原因及修正方案
核心问题
你代码里的关键错误是:修改完数组内的对象后,只将单个修改后的对象写入文件,而非整个更新后的JSON数组。
具体逻辑问题:
- 你成功读取了完整的JSON数组到
jsonarr,也正确修改了指定位置对象的sammelstatus字段(JSON对象是引用类型,修改后会同步到原数组中) - 但最后执行
file.writeText(jsonObject.toString())时,仅把这个单个对象的JSON字符串写入文件,直接覆盖了原本包含222个对象的数组内容,导致其余对象全部丢失。
修正后的代码
把写入文件的内容换成整个JSON数组的字符串即可:
fun writeJsonToInternalStorage(pos: Int) { try { val file = File(this.filesDir, "stempel.json") if (file.exists()) { val jsonString = file.readText() val jsonarr = JSONArray(jsonString) val jsonObject = jsonarr.getJSONObject(pos) jsonObject.put("sammelstatus", 1) // 改为写入整个更新后的数组 file.writeText(jsonarr.toString()) } } catch (e: IOException) { e.printStackTrace() } }
可选优化
如果需要写入格式化后的JSON(方便人工阅读),可以借助Gson库生成带缩进的字符串:
// 先在build.gradle添加依赖 implementation 'com.google.code.gson:gson:2.10.1' // 修改写入逻辑 val gson = GsonBuilder().setPrettyPrinting().create() file.writeText(gson.toJson(jsonarr))
内容的提问来源于stack exchange,提问作者Kalle
相关产品推荐
相关产品推荐

