如何改写完整的更新后JSON文件而非仅嵌套节点?
问题原因分析
你当前的代码在遍历keyArr时,把jsonObject逐步替换成了嵌套层级最底层的IDNew对象,最后写入文件的自然只是这个内层对象,丢失了整个JSON的上层结构。
修改方案
要保留完整JSON结构,需要持有顶层JSON对象的引用,仅定位到目标key的父对象进行更新,最后写入顶层对象:
import org.json.JSONObject; import java.io.FileReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.BufferedReader; public class UpdateJson { public static void main(String[] args) { String filePath = "D://.../test.json"; try { // 读取整个JSON文件内容到字符串 BufferedReader reader = new BufferedReader(new FileReader(filePath)); StringBuilder jsonContent = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { jsonContent.append(line); } reader.close(); // 解析为顶层JSONObject JSONObject topJson = new JSONObject(jsonContent.toString()); String keyToUpdate = "Added.newmem.IDNew.id"; String[] keyArr = keyToUpdate.split("\\."); String targetKey = keyArr[keyArr.length - 1]; // 定位到目标key的父对象(遍历到倒数第二个层级) JSONObject currentLayer = topJson; for (int i = 0; i < keyArr.length - 1; i++) { currentLayer = currentLayer.getJSONObject(keyArr[i]); } // 更新目标key的值 currentLayer.put(targetKey, 12345); // 写入完整的顶层JSON到文件(toString(4)生成带缩进的格式化内容) FileOutputStream outputStream = new FileOutputStream(filePath); outputStream.write(topJson.toString(4).getBytes()); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
关键修改点
- 全程保留顶层
topJson的引用,不替换它,仅用currentLayer遍历定位父层级 - 循环只执行到
keyArr.length - 1,停在目标key的父对象(即IDNew),而非最底层的id - 最终写入的是顶层
topJson的字符串,而非内层对象 - 用
toString(4)生成带缩进的格式化JSON,方便查看结果
内容的提问来源于stack exchange,提问作者DevOps QA
相关产品推荐
相关产品推荐

