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

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结构扩展:

  1. 先引入Jackson依赖(Maven示例)
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.15.2</version>
</dependency>
  1. 核心合并方法实现
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());
            }
        });
    }
}
  1. 使用示例
// 假设你从数据库查询到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:57:03