commit
a61f54f681
@ -0,0 +1,94 @@
|
|||||||
|
package com.ruoyi.kaohe.util;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class JsonDeepMerge {
|
||||||
|
/**
|
||||||
|
* 深度合并json对象
|
||||||
|
* @param target
|
||||||
|
* @param source
|
||||||
|
*/
|
||||||
|
private static void deepMerge(JSONObject target, JSONObject source) {
|
||||||
|
Iterator<String> keys = source.keys();
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
Object sourceValue = source.get(key);
|
||||||
|
if (target.has(key)) {
|
||||||
|
Object targetValue = target.get(key);
|
||||||
|
if (sourceValue instanceof JSONObject && targetValue instanceof JSONObject) {
|
||||||
|
deepMerge((JSONObject) targetValue, (JSONObject) sourceValue);
|
||||||
|
} else if (!targetValue.equals(sourceValue)) {
|
||||||
|
target.put(key, sourceValue);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
target.put(key, sourceValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONArray mergeByKey(JSONArray array, String mergeKey) {
|
||||||
|
JSONArray result = new JSONArray();
|
||||||
|
for (int i = 0; i < array.length(); i++) {
|
||||||
|
JSONObject current = array.getJSONObject(i);
|
||||||
|
String keyValue = current.getString(mergeKey);
|
||||||
|
boolean merged = false;
|
||||||
|
|
||||||
|
for (int j = 0; j < result.length(); j++) {
|
||||||
|
JSONObject existing = result.getJSONObject(j);
|
||||||
|
if (existing.getString(mergeKey).equals(keyValue)) {
|
||||||
|
deepMerge(existing, current);
|
||||||
|
merged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!merged) {
|
||||||
|
result.put(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String jsonStr = "[{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"ejdwmbglyjxkhcj\":{\"djyxzmbrw\":{\"khx1\":100,\"khx1_zb\":0.2,\"khx2\":0,\"khx2_zb\":0.1,\"khx3\":0,\"khx3_zb\":0.1,\"khx4\":0,\"khx4_zb\":0.1,\"khx5\":0,\"khx5_zb\":0.1,\"khx6\":0,\"khx6_zb\":0.1,\"khx7\":0,\"khx7_zb\":0.1,\"khx8\":0,\"khx8_zb\":0.1,\"khx9\":0,\"khx9_zb\":0.05,\"khx10\":97,\"khx10_zb\":0.1,\"khx11\":0,\"khx11_zb\":0.1},\"djyxzmbrw_df\":29.7,\"djyxzmbrw_zb\":0.1,\"djyxzmbrw_zsfs\":2.97}}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"ejdwmbglyjxkhcj\":{\"syfz\":{\"khx1\":0,\"khx1_zb\":0.3,\"khx2\":0,\"khx2_zb\":0.3,\"khx3\":0,\"khx3_zb\":0.4},\"syfz_df\":0,\"syfz_zb\":0.9,\"syfz_zsfs\":0}}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"mzcp\":{\"khx1\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.3},\"khx2\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.3},\"khx3\":{\"avgScore\":0,\"optionA\":0,\"optionB\":0,\"optionC\":0,\"optionD\":0,\"percentage\":0.4}},\"mzcp_df\":0,\"mzcp_zb\":0.3,\"mzcp_zsfs\":0}},{\"khdx\":\"生命科学系\",\"jxdwldbzkhzf\":{\"cx\":{\"khx1\":0},\"cx_df\":0}}]";
|
||||||
|
JSONArray array = new JSONArray(jsonStr);
|
||||||
|
JSONArray merged = mergeByKey(array, "khdx");
|
||||||
|
System.out.println(merged.toString(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String jsonGroupSum(JSONArray jsonInput,String groupKey,String sumKey) throws JsonProcessingException {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
// 解析JSON数组为List<Map>
|
||||||
|
List<Map<String, Object>> inputList = mapper.readValue(jsonInput.toString(2), List.class);
|
||||||
|
|
||||||
|
// 使用Map按khdx分组并累加值
|
||||||
|
Map<String, BigDecimal> sumMap = new HashMap<>();
|
||||||
|
for (Map<String, Object> item : inputList) {
|
||||||
|
String khdx = (String) item.get(groupKey);
|
||||||
|
BigDecimal value=BigDecimal.ZERO;
|
||||||
|
if(item.get(sumKey)!=null){ //非空判断
|
||||||
|
value = new BigDecimal(item.get(sumKey).toString());
|
||||||
|
}
|
||||||
|
sumMap.merge(khdx, value, BigDecimal::add);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转换为目标结构List<Map>
|
||||||
|
List<Map<String, Object>> result = new ArrayList<>();
|
||||||
|
sumMap.forEach((khdx, sum) -> {
|
||||||
|
Map<String, Object> entry = new HashMap<>();
|
||||||
|
entry.put(groupKey, khdx);
|
||||||
|
entry.put(sumKey, sum);
|
||||||
|
result.add(entry);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 输出结果JSON
|
||||||
|
String jsonOutput = mapper.writeValueAsString(result);
|
||||||
|
// System.out.println(jsonOutput);
|
||||||
|
return jsonOutput;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in new issue