package com.yj.earth.common.util; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; import java.util.Map; /** * Map与JSON互相转换工具类 */ @Slf4j public class JsonUtil { private static final ObjectMapper objectMapper = new ObjectMapper(); /** * 将 Map 转换为 JSON 字符串 */ public static String mapToJson(Map map) { if (map == null || map.isEmpty()) { return "{}"; } try { return objectMapper.writeValueAsString(map); } catch (JsonProcessingException e) { log.error("Map转JSON失败", e); return null; } } /** * 将 JSON 字符串转换为 Map */ public static Map jsonToMap(String json) { if (json == null || json.trim().isEmpty()) { return new HashMap<>(0); } try { return objectMapper.readValue(json, new TypeReference>() { }); } catch (Exception e) { log.error("JSON转Map失败、JSON内容: {}", json, e); return new HashMap<>(0); } } /** * 将 JSON 字符串转换为指定类型的对象 */ public static T jsonToObject(String json, Class clazz) { if (json == null || json.trim().isEmpty()) { return null; } return objectMapper.convertValue(json, clazz); } /** * 将 Map 转换为指定类型的对象 */ public static T mapToObject(Map map, Class clazz) { if (map == null || clazz == null) { return null; } try { // 使用 ObjectMapper 将 Map 转换为指定类型对象 return objectMapper.convertValue(map, clazz); } catch (IllegalArgumentException e) { log.error("Map转对象失败、目标类型: {}, Map内容: {}", clazz.getName(), map, e); return null; } } /** * 将任意 Object 转化为 JSON */ public static String toJson(Object obj) { try { return objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("对象转JSON失败", e); return null; } } /** * 修改JSON字符串中指定键的值 */ public static String modifyJsonValue(String json, String key, Object value) { if (json == null || json.trim().isEmpty() || key == null || key.trim().isEmpty()) { return json; } // 将JSON转换为Map Map map = jsonToMap(json); if (map == null) { return json; } // 解析键、支持嵌套 String[] keyParts = key.split("\\."); Map currentMap = map; // 遍历键的各个部分、处理嵌套结构 for (int i = 0; i < keyParts.length; i++) { String part = keyParts[i]; // 如果是最后一个部分、直接设置值 if (i == keyParts.length - 1) { currentMap.put(part, value); break; } // 如果不是最后一个部分、检查是否存在该键且对应的值是Map Object nextObj = currentMap.get(part); if (nextObj instanceof Map) { currentMap = (Map) nextObj; } else { // 如果不存在或不是 Map、创建新的 Map Map newMap = new HashMap<>(); currentMap.put(part, newMap); currentMap = newMap; } } // 将修改后的 Map 转换回 JSON String result = mapToJson(map); return result != null ? result : json; } }