前后端对请求参数排序

本文介绍了在前后端交互中,针对JSON字符串进行排序以满足签名需求的方法。后端使用Java提供了TreeMap、List和Arrays.sort三种排序策略。前端原生JS由于缺乏直接的JSON对象排序功能,需要手动拼接排序后的JSON字符串。文中还特别提到当参数包含对象时的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

签名校验相信不少小伙伴都有碰到过,微信jsapi集成、支付宝集成的时候都会需要加上签名。
这边记录一下当待签名内容是json字符串时的排序方法。

后端(java):
方法一:利用TreeMap
TreeMap本身就是有序集合,每一次插入删除都会进行排序。

Map<String, String> map = new TreeMap<String, String>();
JSONObject jp = new JSONObject();
for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) {
    if (!"sign".equals(key)) {
        jp.put(key, map.get(key));
    }
}

方法二:利用List

Map<String, String> map = new HashMap<String, String>();
List<Map.Entry<String, String>> list=new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
    @Override
    public int compare(Entry<String, String> o1,Entry<String,   String> o2) {           
        return o1.getKey().compareTo(o2.getKey());//这里如果是getValue的话就是根据value排序
            }
});

接下来遍历list,往JSONObject中put值就行了。

for (Entry<String, String> entry : list) {
    if (!"sign".equals(key)) {
        jp.put(entry.getKey(), entry.getValue());
    }
}

方法三:
利用Arrays.sort

Object[] key_arr = params.keySet().toArray();
Arrays.sort(key_arr);
for (Object key : key_arr) {
    if (!"sign".equals(key)) {
        jp.put(key, params.get(key));
    }
}   

注:以上import net.sf.json.JSONObject;

前端:
原生js中好像没有对JSON对象按键值排序的方法(反正我没找到- -),那么就只好自己手动拼装了。
当请求参数对象param都是string键值对时,可以用以下方法生成排好序的JSON字符串:

  var generateJson=function (param) {
    var keys=Object.keys(param).sort();
    var json="{";
    angular.forEach(keys,function (data) {
      json+='"'+data+'":"'+param[data]+'",';
    });
    json=json.substr(0,json.length-1);
    json+="}";
    return json;
  }

当param中存在某个key对应的value是对象而非字符串时,就要特殊处理一下了:

假设

var param={
  appVersion:‘1.0.0’,
  sysVersion:‘1.0.1’,
  deviceType:‘0’,
  deviceModel:‘Nokia’,
  fields:{
      a:'1',
      b:'2'
     }
  };

如果还用generateJson()方法,那么param[data]取到的将是[Object,Object],所以在拼装json字符串的时候,要将fileds先转换为字符串,即将fileds的值看做一个字符串。

 if(data=='fileds'){
    json+='"'+data+'":"'+JSON.stringify(param.fields)+',';
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值