Java中合并两个含相同键的JSONArray的实现方法
Java合并两个JSON payload中的Students数组
完全可行,你可以借助Java常用的JSON处理库(如Jackson、Gson)结合集合类实现这个需求,下面是几种实用方案:
方案一:直接操作JSON数组(Jackson库)
Jackson是Java生态中广泛使用的JSON处理工具,可直接解析JSON并操作数组元素:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; public class JsonMergeExample { public static void main(String[] args) throws Exception { // 两个原始JSON字符串 String json1 = "{\"data\":{\"Students\":[{\"name\":\"Alice\",\"div\":\"A\",\"maths\":56,\"science\":89},{\"name\":\"Bob\",\"div\":\"B\",\"maths\":87,\"science\":34}]}}"; String json2 = "{\"data\":{\"Students\":[{\"name\":\"Charlie\",\"div\":\"C\",\"maths\":45,\"science\":67},{\"name\":\"Doe\",\"div\":\"D\",\"maths\":56,\"science\":78}]}}"; ObjectMapper mapper = new ObjectMapper(); // 解析JSON为JsonNode节点 JsonNode root1 = mapper.readTree(json1); JsonNode root2 = mapper.readTree(json2); // 获取两个Students数组 ArrayNode students1 = (ArrayNode) root1.path("data").path("Students"); ArrayNode students2 = (ArrayNode) root2.path("data").path("Students"); // 将第二个数组的所有元素追加到第一个数组 students1.addAll(students2); // 生成格式化后的合并结果 String mergedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root1); System.out.println(mergedJson); } }
方案二:实体类+List集合(更易维护)
如果JSON结构固定,可先定义对应实体类,将JSON转成List<Student>集合后合并,这种方式可读性和扩展性更强:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; // 学生实体类 class Student { private String name; private String div; private int maths; private int science; // 生成getter、setter和无参构造方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDiv() { return div; } public void setDiv(String div) { this.div = div; } public int getMaths() { return maths; } public void setMaths(int maths) { this.maths = maths; } public int getScience() { return science; } public void setScience(int science) { this.science = science; } } // 包装data层的类 class DataWrapper { private List<Student> Students; public List<Student> getStudents() { return Students; } public void setStudents(List<Student> students) { Students = students; } } // 最外层根类 class RootWrapper { private DataWrapper data; public DataWrapper getData() { return data; } public void setData(DataWrapper data) { this.data = data; } } public class JsonMergeWithEntity { public static void main(String[] args) throws Exception { String json1 = "{\"data\":{\"Students\":[{\"name\":\"Alice\",\"div\":\"A\",\"maths\":56,\"science\":89},{\"name\":\"Bob\",\"div\":\"B\",\"maths\":87,\"science\":34}]}}"; String json2 = "{\"data\":{\"Students\":[{\"name\":\"Charlie\",\"div\":\"C\",\"maths\":45,\"science\":67},{\"name\":\"Doe\",\"div\":\"D\",\"maths\":56,\"science\":78}]}}"; ObjectMapper mapper = new ObjectMapper(); // 解析JSON为实体类对象 RootWrapper root1 = mapper.readValue(json1, RootWrapper.class); RootWrapper root2 = mapper.readValue(json2, RootWrapper.class); // 合并Students集合 List<Student> mergedStudents = new ArrayList<>(root1.getData().getStudents()); mergedStudents.addAll(root2.getData().getStudents()); root1.getData().setStudents(mergedStudents); // 生成合并后的JSON String mergedJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root1); System.out.println(mergedJson); } }
方案三:使用Gson库实现
若习惯用Gson,可采用类似思路操作JSON数组:
import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class GsonMergeExample { public static void main(String[] args) { String json1 = "{\"data\":{\"Students\":[{\"name\":\"Alice\",\"div\":\"A\",\"maths\":56,\"science\":89},{\"name\":\"Bob\",\"div\":\"B\",\"maths\":87,\"science\":34}]}}"; String json2 = "{\"data\":{\"Students\":[{\"name\":\"Charlie\",\"div\":\"C\",\"maths\":45,\"science\":67},{\"name\":\"Doe\",\"div\":\"D\",\"maths\":56,\"science\":78}]}}"; // 解析JSON为JsonObject JsonObject root1 = JsonParser.parseString(json1).getAsJsonObject(); JsonObject root2 = JsonParser.parseString(json2).getAsJsonObject(); // 获取两个Students数组 JsonArray students1 = root1.getAsJsonObject("data").getAsJsonArray("Students"); JsonArray students2 = root2.getAsJsonObject("data").getAsJsonArray("Students"); // 遍历第二个数组,将元素添加到第一个数组 for (int i = 0; i < students2.size(); i++) { students1.add(students2.get(i)); } // 输出合并结果 System.out.println(root1.toString()); } }
关于集合类的说明
Java中的ArrayList、LinkedList等List实现类,可通过addAll()方法快速合并两个集合,操作高效。而JSON库提供的ArrayNode(Jackson)或JsonArray(Gson),本身也内置了元素添加的方法,底层逻辑同样基于集合实现。
内容的提问来源于stack exchange,提问作者Ruby
相关产品推荐
相关产品推荐

