如何在Java中将ArrayList中的多个自定义对象存储到JSON文件?
解决JSON文件写入被覆盖的问题
嘿,我明白你遇到的困扰了——每次循环写入时文件被覆盖,最后只剩单个对象,这是因为你每次都在创建新的JSONObject,并且用FileWriter直接覆盖了整个文件。咱们来一步步解决这个问题,分两种常见场景给你方案:
场景1:myAnimals始终是完整的动物列表
如果每次调用writeJson时,myAnimals已经包含了所有需要保存的动物对象(新增后列表会更新为完整集合),那直接把整个列表转换成JSON数组写入文件就好,这样文件里会保存所有动物的信息:
public void writeJson() { // 创建一个JSON数组来存放所有动物对象 JSONArray animalArray = new JSONArray(); // 遍历myAnimals,把每个动物转成JSONObject加入数组 for (Animal animal : myAnimals) { JSONObject animalObj = new JSONObject(); animalObj.put("name", animal.getAnimalName()); animalObj.put("penType", animal.getPenType()); // 假设你的Animal类有这些getter方法 animalObj.put("landSpace", animal.getLandSpace()); animalObj.put("waterSpace", animal.getWaterSpace()); animalObj.put("airSpace", animal.getAirSpace()); animalArray.put(animalObj); } // 把整个JSON数组写入文件 try (FileWriter file = new FileWriter("animals.json")) { file.write(animalArray.toJSONString()); file.flush(); } catch (IOException e) { e.printStackTrace(); } }
这样每次执行方法,都会把myAnimals里的所有动物一次性写成一个JSON数组,覆盖旧文件,确保文件内容始终是最新的完整列表。
场景2:每次只新增一个动物,不想重新遍历整个列表
如果你的需求是每次新增单个动物后,只把新动物追加到现有JSON文件中(而不是重新写入整个列表),那需要先读取现有文件的JSON数组,加入新对象后再写回去:
public void addNewAnimalToJson(Animal newAnimal) { JSONArray animalArray = new JSONArray(); File jsonFile = new File("animals.json"); // 如果文件已存在且不为空,先读取并解析现有JSON数组 if (jsonFile.exists() && jsonFile.length() > 0) { try (FileReader reader = new FileReader(jsonFile)) { // 用JSONTokener解析现有文件内容 animalArray = new JSONArray(new JSONTokener(reader)); } catch (IOException e) { e.printStackTrace(); } } // 创建新动物的JSONObject并加入数组 JSONObject newAnimalObj = new JSONObject(); newAnimalObj.put("name", newAnimal.getAnimalName()); newAnimalObj.put("penType", newAnimal.getPenType()); newAnimalObj.put("landSpace", newAnimal.getLandSpace()); newAnimalObj.put("waterSpace", newAnimal.getWaterSpace()); newAnimalObj.put("airSpace", newAnimal.getAirSpace()); animalArray.put(newAnimalObj); // 把更新后的数组写回文件 try (FileWriter writer = new FileWriter(jsonFile)) { writer.write(animalArray.toJSONString()); writer.flush(); } catch (IOException e) { e.printStackTrace(); } }
为什么原来的代码会出问题?
你之前的循环中,每次都会创建一个新的JSONObject,然后立刻用FileWriter写入文件——而FileWriter默认会覆盖文件内容,所以最后一次循环的对象会把之前的所有内容都替换掉。用JSONArray把所有对象打包后一次性写入,就能避免这个问题啦。
注:假设你使用的是
org.json库(代码里的JSONObject/JSONArray都来自这个库),确保已经引入对应的依赖哦。
内容的提问来源于stack exchange,提问作者Steven Patrick
相关产品推荐
相关产品推荐

