您的位置:首页 > 移动开发 > Objective-C

java实现对实体类及JsonObject内部按ASCII码表排序输出

2018-02-06 10:20 1006 查看
需求:将所有非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值

对的格式(即 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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息