Java如何将JSON列表所有元素合并为带各字段求和结果的单条JSON
实现方案
以下是两种高性价比的实现方式,不需要手动写复杂的HashMap遍历逻辑:
方案1:数据库层直接聚合(优先推荐)
如果你的JSON存储在MongoDB这类支持结构化JSON聚合的数据库中,直接在数据库侧完成求和逻辑即可,不需要拉取全量数据到应用层:
// MongoDB聚合语句示例 db.your_collection.aggregate([ { $group: { _id: null, "10_female_count": { $sum: "$detail.10.female.visited_person_count" }, "10_female_time": { $sum: "$detail.10.female.visited_stay_time_sum" }, "10_male_count": { $sum: "$detail.10.male.visited_person_count" }, "10_male_time": { $sum: "$detail.10.male.visited_stay_time_sum" }, "20_female_count": { $sum: "$detail.20.female.visited_person_count" }, "20_female_time": { $sum: "$detail.20.female.visited_stay_time_sum" }, "20_male_count": { $sum: "$detail.20.male.visited_person_count" }, "20_male_time": { $sum: "$detail.20.male.visited_stay_time_sum" } } }, // 调整输出结构为你需要的格式 { $project: { _id: 0, detail: { "10": { female: { visited_person_count: "$10_female_count", visited_stay_time_sum: "$10_female_time" }, male: { visited_person_count: "$10_male_count", visited_stay_time_sum: "$10_male_time" } }, "20": { female: { visited_person_count: "$20_female_count", visited_stay_time_sum: "$20_female_time" }, male: { visited_person_count: "$20_male_count", visited_stay_time_sum: "$20_male_time" } } } } } ])
方案2:Java应用层Jackson递归合并
如果必须在应用层处理,使用Jackson JSON库的动态节点能力写通用递归合并逻辑,代码简洁且支持后续JSON结构扩展:
- 先引入Jackson依赖(Maven示例)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
- 核心合并方法实现
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.List; public class JsonMergeUtils { private static final ObjectMapper objectMapper = new ObjectMapper(); public static JsonNode mergeJsonList(List<JsonNode> jsonList) { if (jsonList.isEmpty()) return objectMapper.createObjectNode(); // 初始化结果为第一个JSON的深拷贝 ObjectNode result = jsonList.get(0).deepCopy(); // 遍历剩余所有JSON合并到结果 for (int i = 1; i < jsonList.size(); i++) { mergeNode(result, jsonList.get(i)); } return result; } private static void mergeNode(ObjectNode current, JsonNode addNode) { addNode.fields().forEachRemaining(entry -> { String key = entry.getKey(); JsonNode value = entry.getValue(); if (value.isObject()) { // 是对象类型,递归合并子节点 mergeNode((ObjectNode) current.get(key), value); } else if (value.isNumber()) { // 是数值类型,求和后覆盖 current.put(key, current.get(key).asLong() + value.asLong()); } }); } }
- 使用示例
// 假设你从数据库查询到的JSON字符串列表是jsonStrList List<JsonNode> jsonNodeList = jsonStrList.stream() .map(str -> { try { return objectMapper.readTree(str); } catch (Exception e) { throw new RuntimeException(e); } }) .toList(); JsonNode mergedResult = JsonMergeUtils.mergeJsonList(jsonNodeList); // 转成JSON字符串输出即可 System.out.println(mergedResult.toPrettyString());
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

