Android项目中JSON写入int失败,重启后覆盖文件问题求助
解决Android中JSON文件无法写入、重启后不生效的问题
嘿,我一眼就看出问题所在了——你现在操作的是assets目录下的JSON文件,这个目录里的文件是打包进APK的只读资源,根本没法直接修改!要实现退出重启后仍能保留修改的效果,得把文件复制到App的可读写存储目录,之后所有读写操作都围绕这个副本进行。
下面是完整的解决方案,一步步来:
1. 把assets里的JSON复制到内部存储
先写个工具方法,检查内部存储里有没有我们的JSON文件,如果没有就从assets复制过去:
private void copyJsonToInternalStorage() { // 内部存储的文件路径:/data/data/你的包名/files/useriidd.json File internalFile = new File(getFilesDir(), "useriidd.json"); if (!internalFile.exists()) { try (InputStream is = getAssets().open("useriidd.json"); OutputStream os = new FileOutputStream(internalFile)) { byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); } } }
2. 修改读取方法,读取内部存储的文件
把你原来的getJsonFile()改成读取内部存储的副本,而不是assets里的只读文件:
public String getJsonFile() { // 先确保文件已复制到内部存储 copyJsonToInternalStorage(); File internalFile = new File(getFilesDir(), "useriidd.json"); StringBuilder jsonContent = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new FileReader(internalFile))) { String line; while ((line = reader.readLine()) != null) { jsonContent.append(line); } } catch (IOException ex) { ex.printStackTrace(); } return jsonContent.toString(); }
3. 实现写入方法,保存修改后的userid
现在可以写一个方法,把int类型的userid写入到JSON文件里了。注意原JSON里的userid是字符串类型,所以这里把int转成String存储;如果你想改成int类型,直接把原JSON里的"0"改成0,然后写入时直接put int值就行:
public void saveUserIdToJson(int newUserId) { try { // 读取当前JSON内容 String jsonStr = getJsonFile(); JSONObject rootObj = new JSONObject(jsonStr); JSONObject userObj = rootObj.getJSONObject("user"); // 修改userid:如果原JSON是字符串类型,转成String存入;如果是int类型直接put(newUserId) userObj.put("userid", String.valueOf(newUserId)); // 把修改后的JSON写回文件 File internalFile = new File(getFilesDir(), "useriidd.json"); try (FileWriter writer = new FileWriter(internalFile)) { writer.write(rootObj.toString()); writer.flush(); } } catch (JSONException | IOException e) { e.printStackTrace(); } }
4. 使用示例
当你需要保存userid时,直接调用:
// 比如保存userid为123 saveUserIdToJson(123);
退出App重启后,调用getJsonFile()就能读到修改后的{"user": {"userid":"123"}}了。
额外注意点
- 如果你需要外部存储(比如让用户能看到这个文件),可以把
getFilesDir()换成getExternalFilesDir(null),记得要申请外部存储权限(Android 10及以上不需要,但低版本需要)。 - 操作JSON时尽量用try-with-resources语法,避免流泄漏。
内容的提问来源于stack exchange,提问作者Nygards




