java对对象或者map的属性进行排序

package com.xkj.spider.mpb.util;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import lombok.extern.slf4j.Slf4j;

/**
 * 对属性进行排序得一个排序后的属性字符串
 * @author yangzl
 * @data 2019年4月4日
 *
 */
@Slf4j
public class SortPropertiesUtils {
    public static final String PARAM_EQUAL = "=";
    public static final String PARAM_AND = "&";
    
    private SortPropertiesUtils() {}
        
    /**
     * 对Object进行List<NameValuePair>转换后按key进行升序排序,以key=value&...形式返回
     * 
     * @param list
     * @return
     */
    public static String sort(Object order) {
        Map<String, Object> map = bean2Parameters(order);
        return sort(map);
    }

    /**
     * 对对Object转换后, 以key=value&...形式返回按key进行升序排序,以key=value&...形式返回
     * 
     * @param order
     * @return
     */
    public static String sort(Map<String, Object> order) {
        if (null == order || order.isEmpty()) {
            return null;
        }

        Map<String, Object> parameters = new TreeMap<>((obj1, obj2) -> obj1.compareToIgnoreCase(obj2));
        parameters.putAll(order);

        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
            if (null != entry.getValue()) {
                sb.append(entry.getKey());
                sb.append(PARAM_EQUAL);
                sb.append(entry.getValue().toString());
                sb.append(PARAM_AND);
            }
        }

        String params = sb.toString();
        if (sb.toString().endsWith(PARAM_AND)) {
            params = sb.substring(0, sb.length() - 1);
        }
        return params;
    }

    /**
     * 将bean转换成键值对列表
     * 
     * @param bean
     * @return
     */
    private static Map<String, Object> bean2Parameters(Object bean) {
        if (bean == null) {
            return null;
        }

        Map<String, Object> parameters = new HashMap<>();

        if (null != parameters) {
            // 取得bean所有public 方法
            Method[] Methods = bean.getClass().getMethods();
            for (Method method : Methods) {
                if (method != null && method.getName().startsWith("get") && !method.getName().startsWith("getClass")) {
                    // 得到属性的类名
                    Object value = null;
                    // 得到属性值
                    try {
                        value = method.invoke(bean);
                        if (null != value) {
                            // 添加参数
                            // 将方法名称转化为id,去除get,将方法首字母改为小写
                            String param = method.getName().replaceFirst("get", "");
                            if (param.length() > 0) {
                                String first = String.valueOf(param.charAt(0)).toLowerCase();
                                param = first + param.substring(1);
                            }
                            parameters.put(param, value);
                        }
                    } catch (Exception e) {
                        log.error("", e.getMessage(), e);
                    }
                }
            }
        }

        return parameters;
    }
}

在大部分有md5签名验证,或者一些加密算法的验证中都需要对数据进行排序。

猜你喜欢

转载自www.cnblogs.com/yangzhilong/p/10672218.html
今日推荐