You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:52:46