MapUtil.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package com.backendsys.utils;
  2. import cn.hutool.json.JSONArray;
  3. import cn.hutool.json.JSONObject;
  4. import org.springframework.cglib.beans.BeanMap;
  5. import java.lang.reflect.Field;
  6. import java.util.*;
  7. @SuppressWarnings({"rawtypes", "unchecked"})
  8. public class MapUtil {
  9. /**
  10. * 获取多层 Map 中指定路径的值。
  11. * MapUtil.get(response, "Header.Code")
  12. */
  13. public static Object get(Map<String, Object> map, String keyPath) {
  14. String[] keys = keyPath.split("\\.");
  15. Map<String, Object> currentMap = map;
  16. for (String key : keys) {
  17. Object obj = currentMap.get(key);
  18. if (obj instanceof Map) {
  19. currentMap = (Map<String, Object>) obj;
  20. } else {
  21. return obj;
  22. }
  23. }
  24. return null;
  25. }
  26. /**
  27. * 将大驼峰命名转换为下划线命名 (单个Key值)
  28. */
  29. public static String convertKeyToUnderscoreCase(String input) {
  30. StringBuilder result = new StringBuilder();
  31. for (int i = 0; i < input.length(); i++) {
  32. char currentChar = input.charAt(i);
  33. if (Character.isUpperCase(currentChar) && i > 0) {
  34. result.append("_").append(Character.toLowerCase(currentChar));
  35. } else {
  36. result.append(Character.toLowerCase(currentChar));
  37. }
  38. }
  39. return result.toString();
  40. }
  41. /**
  42. * 将大驼峰命名转换为下划线命名 (单条记录)
  43. */
  44. public static Map<String, Object> convertToUnderscoreCase(Map<String, Object> map) {
  45. Map<String, Object> newMap = new HashMap<>();
  46. for (Map.Entry<String, Object> entry : map.entrySet()) {
  47. // 检查值是否为Map,如果是,则递归调用convertToUnderscoreCase
  48. if (entry.getValue() instanceof Map) {
  49. Map<String, Object> value = (Map<String, Object>) entry.getValue();
  50. String newKey = convertKeyToUnderscoreCase(entry.getKey());
  51. newMap.put(newKey, convertToUnderscoreCase(value));
  52. } else {
  53. // 如果不是Map,则直接复制键值对
  54. newMap.put(convertKeyToUnderscoreCase(entry.getKey()), entry.getValue());
  55. }
  56. }
  57. return newMap;
  58. }
  59. /**
  60. * 将 实体类字段命名 转换为 首字母小写的 小驼峰命名
  61. */
  62. public static JSONObject convertEntityToJson(Object entity) throws IllegalAccessException {
  63. JSONObject json = new JSONObject();
  64. Class<?> clazz = entity.getClass();
  65. // 遍历实体类的所有字段
  66. for (Field field : clazz.getDeclaredFields()) {
  67. field.setAccessible(true); // 确保可以访问私有字段
  68. // 获取字段名,并转换为小驼峰命名法
  69. String fieldName = convertToCamelCase(field.getName());
  70. Object fieldValue = field.get(entity);
  71. if (fieldValue != null) {
  72. if (List.class.isAssignableFrom(field.getType())) {
  73. // 字段是List类型
  74. List<?> list = (List<?>) fieldValue;
  75. JSONArray jsonArray = new JSONArray();
  76. for (Object item : list) {
  77. if (item instanceof Object) {
  78. // 如果列表项是实体类对象,则递归转换
  79. jsonArray.put(convertEntityToJson(item));
  80. } else {
  81. // 否则直接添加到数组中
  82. jsonArray.put(item);
  83. }
  84. }
  85. json.set(fieldName, jsonArray);
  86. // json.put(fieldName, jsonArray);
  87. } else if (Map.class.isAssignableFrom(field.getType())) {
  88. // 字段是Map类型
  89. Map<?, ?> map = (Map<?, ?>) fieldValue;
  90. JSONObject jsonMap = new JSONObject();
  91. for (Map.Entry<?, ?> entry : map.entrySet()) {
  92. Object key = entry.getKey();
  93. Object value = entry.getValue();
  94. if (value instanceof Object) {
  95. // 如果Map的值是实体类对象,则递归转换
  96. jsonMap.set(key.toString(), convertEntityToJson(value));
  97. // jsonMap.put(key.toString(), convertEntityToJson(value));
  98. } else {
  99. // 否则直接添加到Map中
  100. jsonMap.set(key.toString(), value);
  101. // jsonMap.put(key.toString(), value);
  102. }
  103. }
  104. json.set(fieldName, jsonMap);
  105. // json.put(fieldName, jsonMap);
  106. } else if (
  107. String.class.isAssignableFrom(field.getType()) ||
  108. Integer.class.isAssignableFrom(field.getType()) ||
  109. Double.class.isAssignableFrom(field.getType()) ||
  110. Float.class.isAssignableFrom(field.getType()) ||
  111. Long.class.isAssignableFrom(field.getType()) ||
  112. Short.class.isAssignableFrom(field.getType()) ||
  113. Byte.class.isAssignableFrom(field.getType()) ||
  114. Boolean.class.isAssignableFrom(field.getType()) ||
  115. Character.class.isAssignableFrom(field.getType()) ||
  116. field.getType().isArray()
  117. ) {
  118. // 判断不了实体类,只能判断上面的通用类型,适合类型的直接输出
  119. json.set(fieldName, fieldValue);
  120. // json.put(fieldName, fieldValue);
  121. } else {
  122. // 无法识别实体类类型 else if (field.getType().isAssignableFrom(Entity.class)
  123. // 字段是实体类的实例,递归转换
  124. json.set(fieldName, convertEntityToJson(fieldValue));
  125. // json.put(fieldName, convertEntityToJson(fieldValue));
  126. }
  127. }
  128. }
  129. return json;
  130. }
  131. // 将下划线命名法转换为小驼峰命名法
  132. public static String convertToCamelCase(String name) {
  133. if (name == null || name.isEmpty()) {
  134. return name;
  135. }
  136. StringBuilder result = new StringBuilder();
  137. boolean nextUpper = false;
  138. for (int i = 0; i < name.length(); i++) {
  139. char c = name.charAt(i);
  140. if (c == '_') {
  141. nextUpper = true;
  142. } else {
  143. if (nextUpper) {
  144. result.append(Character.toUpperCase(c));
  145. nextUpper = false;
  146. } else {
  147. result.append(Character.toLowerCase(c));
  148. }
  149. }
  150. }
  151. return result.toString();
  152. }
  153. /**
  154. * 将对象装换为map
  155. * @param bean
  156. * @return
  157. */
  158. public static <T> Map<String, Object> beanToMap(T bean) {
  159. Map<String, Object> map = new HashMap();
  160. if (bean != null) {
  161. BeanMap beanMap = BeanMap.create(bean);
  162. for (Object key : beanMap.keySet()) {
  163. map.put(key + "", beanMap.get(key));
  164. }
  165. }
  166. return map;
  167. }
  168. /**
  169. * 合并两个map数据(建议使用)
  170. * @param mergedMap
  171. * @param newMap
  172. * @return
  173. * @author zero 2019/04/17
  174. */
  175. public static Map<String, String> mergeMap(Map<String, String> mergedMap, Map<String, String> newMap) {
  176. if (mergedMap.isEmpty() || mergedMap == null)
  177. return newMap;
  178. if (newMap.isEmpty() || newMap == null)
  179. return newMap;
  180. for (String key : newMap.keySet()) {
  181. if (mergedMap.containsKey(key)) {
  182. mergedMap.put(key, mergedMap.get(key) + newMap.get(key));
  183. } else {
  184. mergedMap.put(key, newMap.get(key));
  185. }
  186. }
  187. return mergedMap;
  188. }
  189. }