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}