需求:将所有非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值
对的格式(即 key1=value1&key2=value2…)拼接成字符串 stringA。
特别注意以下重要规则:
◆ 参数名 ASCII 码从小到大排序(字典序);
对的格式(即 key1=value1&key2=value2…)拼接成字符串 stringA。
特别注意以下重要规则:
◆ 参数名 ASCII 码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
以上需求对应的处理代码如下:这里使用反射读取实体类的属性值,做到可以通用。读取出值之后再放入map进行排序输出。
/**
* 反射拼接类的属性值
*
* @param clazz
* @param list
* @return
*/
public static String getAscOrderString(Class clazz, Object object) {
String rawString="";
Map<String, String> map=new HashMap<String, String>();
Field[] fs = clazz.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field field = fs[i];
field.setAccessible(true);
String valString;
try {
if( field.get(object)==null){
valString = "";
}else{
valString = field.get(object).toString();
}
map.put(field.getName(), valString);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Collection<String> keyset= map.keySet();
List list=new ArrayList<String>(keyset);
Collections.sort(list);
for(int i=0;i<list.size();i++){
if(i==(list.size()-1)){
if(!StringUtils.isEmpty(map.get(list.get(i)))){
rawString+=list.get(i)+"="+map.get(list.get(i));
}
}else{
if(!StringUtils.isEmpty(map.get(list.get(i)))){
rawString+=list.get(i)+"="+map.get(list.get(i))+"&";
}
}
}
return rawString;
}
要对JsonObject内部排序并输出jsonObject时: jsonObject可以直接转map,取出keySet排序后再依次插入LinkedHashMap中
//jsonObject 排序输出jsonObject字符串
public static String getAscString(JSONObject json) {
Map<String, String> jsonMap=json;
List<String> keys = new ArrayList<String>(jsonMap.keySet());
Collections.sort(keys);
LinkedHashMap<String, String> map=new LinkedHashMap<String, String>();
for(int i=0;i<keys.size();i++){
if(StringUtils.isNotEmpty(keys.get(i))){
map.put(keys.get(i), jsonMap.get(keys.get(i)));
}
}
JSONObject jsonObject=JSONObject.fromObject(map);
return jsonObject.toString();
}