如何向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
相关产品推荐
相关产品推荐

