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

如何向ArrayNode添加ObjectNode不覆盖旧数据?Java代码问题排查

问题描述

构建API层项目时,调用Directus API获取数据并以JSON格式返回指定数据,但Java代码中循环向ArrayNode添加ObjectNode时,所有元素均被最后一条数据覆盖。

我的代码

public String findAllPersons(HttpServletResponse response, String showFields) throws IOException{

  try {
    // Call to the database (this part is normally not a problem
    String url = "https://cuxhsjf3.directus.app/items/blog";
    PersonRoot personRoot = template.getForObject(url, PersonRoot.class);
    // I used the Objectmapper, since I'm going from normal data to Json.
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode personsObject = objectMapper.createObjectNode();
    ArrayNode persons = objectMapper.createArrayNode();
    // The array is going to loop through all the data objects from the database
    for (int i = 0; i < personRoot.data.toArray().length; i++) {
    // I put person objects into an array, and I return this array.
      personsObject.put("id", personRoot.data.get(i).id);
      personsObject.put("firstName", personRoot.data.get(i).firstName);
      persons.add(personsObject);
      System.out.println(persons);
    }
    String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(persons);
    return json;
}
// The 'catch' was omitted as not related to the issue

预期结果

{
      "id": "050469ed-0501-4506-9951-794b41bf7e7f",
      "firstName": "Elias"
    },
    {
      "id": "0bfb52f7-3656-4202-8c24-2b63eaeca6a9",
      "firstName": "Mathias"
    },
    {
      "id": "3145fb95-afd7-4bc4-a62e-a8622b301db2",
      "firstName": "Brent"
    },
    {
      "id": "5b93c9b1-4bd1-4aa5-a5ca-d46e849cc58f",
      "firstName": "Jef "
    },
    {
      "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
      "firstName": "Jan"
    }

实际输出

{
    "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
    "firstName": "Jan"
  },
  {
    "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
    "firstName": "Jan"
  },
  {
    "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
    "firstName": "Jan"
  },
  {
    "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
    "firstName": "Jan"
  },
  {
    "id": "cb3d5d02-6b87-4aa1-b817-17550b3cf03c",
    "firstName": "Jan"
  }

解决方案

问题根源

你只创建了一个ObjectNode实例,循环中只是不断修改这个实例的属性值,然后重复添加到ArrayNode里。因为ArrayNode存储的是对象引用,所有元素指向的都是同一个ObjectNode,最终所有元素都会显示最后一次修改后的值。

修复代码

把ObjectNode personsObject = objectMapper.createObjectNode();移到循环内部,每次循环都创建新的ObjectNode实例:

public String findAllPersons(HttpServletResponse response, String showFields) throws IOException{

  try {
    String url = "https://cuxhsjf3.directus.app/items/blog";
    PersonRoot personRoot = template.getForObject(url, PersonRoot.class);
    ObjectMapper objectMapper = new ObjectMapper();
    ArrayNode persons = objectMapper.createArrayNode();
    
    for (int i = 0; i < personRoot.data.toArray().length; i++) {
      // 每次循环创建新的ObjectNode实例
      ObjectNode personsObject = objectMapper.createObjectNode();
      personsObject.put("id", personRoot.data.get(i).id);
      personsObject.put("firstName", personRoot.data.get(i).firstName);
      persons.add(personsObject);
      System.out.println(persons);
    }
    String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(persons);
    return json;
}
// 省略catch块

优化建议

可以用增强for循环简化代码,可读性更好:

public String findAllPersons(HttpServletResponse response, String showFields) throws IOException{

  try {
    String url = "https://cuxhsjf3.directus.app/items/blog";
    PersonRoot personRoot = template.getForObject(url, PersonRoot.class);
    ObjectMapper objectMapper = new ObjectMapper();
    ArrayNode persons = objectMapper.createArrayNode();
    
    for (Person person : personRoot.data) {
      ObjectNode personsObject = objectMapper.createObjectNode();
      personsObject.put("id", person.id);
      personsObject.put("firstName", person.firstName);
      persons.add(personsObject);
    }
    return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(persons);
}
// 省略catch块

内容的提问来源于stack exchange,提问作者brentvancalster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:25:48