001package top.cenze.utils; 002 003import cn.hutool.core.collection.CollectionUtil; 004import cn.hutool.core.util.ObjectUtil; 005import cn.hutool.core.util.StrUtil; 006import com.alibaba.fastjson.JSONObject; 007import com.fasterxml.jackson.annotation.JsonInclude; 008import lombok.Data; 009 010import java.lang.reflect.Field; 011import java.util.Map; 012import java.util.Set; 013import java.util.TreeMap; 014 015/** 016 * @desc: ASCII码工具 017 * @author: chengze 018 * @createByDate: 2024/6/17 11:39 019 */ 020@Data 021@JsonInclude(JsonInclude.Include.NON_NULL) 022public class AsciiUtil { 023 024 /** 025 * 对象按字段名ASCII码升序转有序map, 排除空值字段 026 * @param obj 027 * @return 028 */ 029 public static TreeMap<String, Object> sortByAsc(Object obj) { 030 return sortByAsc(obj, true); 031 } 032 033 /** 034 * 对象按字段名ASCII码升序转有序map 035 * @param obj 036 * @param excludeNullField 是否排除空值字段,true排除,false不排除 037 * @return 038 */ 039 public static TreeMap<String, Object> sortByAsc(Object obj, boolean excludeNullField) { 040 if (ObjectUtil.isNull(obj)) { 041 return null; 042 } 043 044 // 获取所有的字段,包括私有的 045 Field[] fields = obj.getClass().getDeclaredFields(); 046 047 // 使用TreeMap保证键的排序 048 TreeMap<String, Object> sortedMap = new TreeMap<>(); 049 050 for (Field field : fields) { 051 field.setAccessible(true); // 允许访问私有字段 052 try { 053 // 获取字段值并放入Map 054 Object value = field.get(obj); 055 if (excludeNullField && ObjectUtil.isNotNull(value)) { 056 sortedMap.put(field.getName(), value); 057 } else { 058 sortedMap.put(field.getName(), value); 059 } 060 } catch (IllegalAccessException e) { 061 e.printStackTrace(); 062 } 063 } 064 065 return sortedMap; 066 } 067 068 /** 069 * JSON对象按字段名ASCII码升序转有序map, 排除空值字段 070 * @param jsonObj 071 * @return 072 */ 073 public static TreeMap<String, Object> sortByAsc(JSONObject jsonObj) { 074 return sortByAsc(jsonObj, true); 075 } 076 077 /** 078 * JSON对象按字段名ASCII码升序转有序map 079 * @param jsonObj 080 * @param excludeNullField 是否排除空值字段,true排除,false不排除 081 * @return 082 */ 083 public static TreeMap<String, Object> sortByAsc(JSONObject jsonObj, boolean excludeNullField) { 084 if (ObjectUtil.isNull(jsonObj)) { 085 return null; 086 } 087 088 Set<String> keys = jsonObj.keySet(); 089 if (CollectionUtil.isEmpty(keys)) { 090 return null; 091 } 092 093 // 使用TreeMap保证键的排序 094 TreeMap<String, Object> sortedMap = new TreeMap<>(); 095 096 for (String key : keys) { 097 // 获取字段值并放入Map 098 Object value = jsonObj.get(key); 099 if (excludeNullField && ObjectUtil.isNotNull(value)) { 100 sortedMap.put(key, value); 101 } else { 102 sortedMap.put(key, value); 103 } 104 } 105 106 return sortedMap; 107 } 108 109 /** 110 * MAP对象按字段名ASCII码升序转有序map, 排除空值字段 111 * @param mapObj 112 * @return 113 */ 114 public static TreeMap<String, Object> sortByAsc(Map<String, Object> mapObj) { 115 return sortByAsc(mapObj, true); 116 } 117 118 /** 119 * MAP对象按字段名ASCII码升序转有序map 120 * @param mapObj 121 * @param excludeNullField 是否排除空值字段,true排除,false不排除 122 * @return 123 */ 124 public static TreeMap<String, Object> sortByAsc(Map<String, Object> mapObj, boolean excludeNullField) { 125 if (CollectionUtil.isEmpty(mapObj)) { 126 return null; 127 } 128 129 // 使用TreeMap保证键的排序 130 TreeMap<String, Object> sortedMap = new TreeMap<>(); 131 132 for (Map.Entry<String, Object> entry : mapObj.entrySet()) { 133 // 获取字段值并放入Map 134 if (excludeNullField && ObjectUtil.isNotNull(entry.getValue())) { 135 sortedMap.put(entry.getKey(), entry.getValue()); 136 } else { 137 sortedMap.put(entry.getKey(), entry.getValue()); 138 } 139 } 140 141 return sortedMap; 142 } 143 144 /** 145 * 有序MAP转URL字符串,以 & 符分隔 146 * @param treeMap 147 * @return 148 */ 149 public static String treeMap2UrlStr(TreeMap<String, Object> treeMap) { 150 return treeMap2UrlStr(treeMap, "&"); 151 } 152 153 /** 154 * 有序MAP转URL字符串 155 * @param treeMap 156 * @param separator 分隔符,默认为 & 157 * @return 158 */ 159 public static String treeMap2UrlStr(TreeMap<String, Object> treeMap, String separator) { 160 if (CollectionUtil.isEmpty(treeMap)) { 161 return null; 162 } 163 164 if (StrUtil.isEmpty(separator)) { 165 separator = "&"; 166 } 167 168 StringBuilder sb = new StringBuilder(); 169 for (String key : treeMap.keySet()) { 170 sb.append(key).append("=").append(treeMap.get(key)).append(separator); 171 } 172 173 String str = sb.toString(); 174 if (StrUtil.isNotEmpty(str)) { 175 str = str.substring(0, str.length() - 1); 176 } 177 178 return str; 179 } 180}