随着json的盛行,很多接口签名都会用到json形势的body体。而在对json进行签名和对方验签的时候,在组装json字符串时候,json中key排序的规则、顺序,会直接影响签名结果。所以,一个完善的接口说明,如果json内容参与签名,是务必要规范json排序规则的。
以下实现了,根据json中的key,按照ascii升序排序。

JSONObject json  = new JSONObject();//默认无序
json.put("account", "111111");
json.put("domain", "11111");
json.put("status",1);
json.put("passwd", DigestUtils.md5DigestAsHex("test".getBytes()));
json.put("tag", System.currentTimeMillis());
json.put("ts", System.currentTimeMillis());
json.put("gid", "67");
json.put("xe", new String(Base64Utils.encode("测试".getBytes("GBK"))));

默认输出:
{“gid”:“67”,“passwd”:“098f6bcd4621d373cade4e832627b4f6”,“domain”:“11111”,“tag”:1684370379044,“xe”:“suLK1A==”,“account”:“111111”,“status”:1,“ts”:1684370379044}
可以看到,key的顺序并不符合预期。

通过如下代码排序

SortedMap<String,Object> sMap = new TreeMap<>(json);
JSONObject sortJson = new JSONObject(true);//表示有序的json,不参与排序,
sortJson.putAll(sMap);
System.out.println(sortJson.toString());

输出结果:
{“account”:“111111”,“domain”:“11111”,“gid”:“67”,“passwd”:“098f6bcd4621d373cade4e832627b4f6”,“status”:1,“tag”:1684370960447,“ts”:1684370960447,“xe”:“suLK1A==”}

以上实现了json根据key升序排序。

当需要对JSONArray中的json进行排序,

JSONArray array  = JSONArray.parseArray("[{'msg':'ccc','phoneNumbers':'139033333','signName':'APP'},{'msg':'b','phoneNumbers':'139011111','signName':'APP'},{'msg':'d','phoneNumbers':'139000000','signName':'APP'}]");
System.out.println(array);

输出结果如下,json中内容是无序的:
[{“msg”:“ccc”,“signName”:“APP”,“phoneNumbers”:“139033333”},{“msg”:“b”,“signName”:“APP”,“phoneNumbers”:“139011111”},{“msg”:“d”,“signName”:“APP”,“phoneNumbers”:“139000000”}]

JSONArray array2  = new JSONArray();
for(int i = 0; i < array.size(); i++) {JSONObject tempJson = (JSONObject) array.get(i);SortedMap<String,Object> sMap = new TreeMap<>(tempJson);JSONObject sortJson = new JSONObject(true);//表示有序的json,不参与排序sortJson.putAll(sMap);array2.add(sortJson);
}
System.out.println(array2);

排序后输出内容:
[{“msg”:“ccc”,“phoneNumbers”:“139033333”,“signName”:“APP”},{“msg”:“b”,“phoneNumbers”:“139011111”,“signName”:“APP”},{“msg”:“d”,“phoneNumbers”:“139000000”,“signName”:“APP”}]

JSONObject排序问题相关推荐

  1. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qingfeng812/article/details/61194594 背景 记录项目中遇到的 关于 ...

  2. MySQL中对varchar类型排序问题的解决

    mysql数据库,把数值型的写成varchar类型 ,其实应该建为int的.因为我只允许输出数字.发现排序有问题.下面简单说一下MySQL的varchar排序问题. 下面,我从数据库里面以number ...

  3. JSONObject 和 JSONArray 获取value 的方法

    JSONObject 和 JSONArray 获取value 值 主要是根据key 值来获取的,使用方法是get() 或者getJSONObject 方法很简单 下面列举几个例子,大家可以参考下代码 ...

  4. Value xxx of type org.json.JSONObject cannot be converted to JSONArray

    这个异常是try catch 走到error 里面了 说的已经很清楚了 json 是 字符串 不是数组形式 而我的使用 json 是字符串形式 , JSONArray jsonArray = new ...

  5. Json 学习 JSONObject 和 JSONArray

    1  JSONObject 添加一个jsonobject JSONObject jsonObject = new JSONObject();jsonObject.put("age" ...

  6. JSONObject没有fromObject方法(Json lib 库的使用)

    刚开始还不知道为啥,最后到 jsonlib 网站上查看了原因,这个是连接地址 Json-lib comes in two flavors, depending on the jdk compatibi ...

  7. 1.JSONObject与JSONArray的使用

    参考文献: http://blog.csdn.net/huangwuyi/article/details/5412500 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib ...

  8. 关于spring aop Advisor排序问题

    关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...

  9. JsonObject json字符串转换成JSonObject对象

    字符串: {"code":"1004","msg":"请先添加系统靠勤人员信息!","userRegistIn ...

最新文章

  1. java ehcahce刷新_Spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除...
  2. vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
  3. 设计模式四:策略模式
  4. 听说,霸都.NET技术社区准备搞线下聚会了?
  5. WordPress程序备受喜爱的原因:十八般武艺
  6. Java常用接口与类——String类、StringBuffer类、StringBuilder类
  7. linux oracle 服务重启过程
  8. PyTorch 学习笔记(七):PyTorch的十个优化器
  9. Understanding Bootstrap Of Oracle Database
  10. 项目介绍star原理_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍
  11. 剑指offer 66题 -- 丑数
  12. SAP GUI 770下载
  13. html当前页面的脚本发生错误,如何解决“当前页面脚本发生错误”的问题
  14. android 生成bks_Android 添加 证书(pem,crt,p12,bks,jks)到 keystore.bks
  15. 配置VS2019 执行cu文件
  16. js经典代码200句
  17. 人脸识别-----Olivetti Faces人脸数据集合处理
  18. 如何理解 0.1+0.2
  19. 音频线是什么 音频线如何连接
  20. mysql mpp_MPP调研

热门文章

  1. 转自随风飘荡自由飞翔 SQL技巧:快速把握一些异常精妙的SQL语句
  2. memmove函数c语言实现,【C语言】实现memcopy、memmove函数
  3. Docker容器学习笔记(看了狂神视频)
  4. 六家共享单车加入免押计划 押金模式即将崩盘?
  5. 微信广告转化归因几个坑 gdt_vid和clickid
  6. TiDB | TiDB在5A级物流企业核心系统的应用与实践
  7. C++基础知识 - 多重继承的二义性问题
  8. Arturia ARP 2600 V3 for Mac - 音响模拟合成工具
  9. 高考生男生学铁路好还是计算机好,男生学铁路什么专业好?附铁路最好的5个专业...
  10. oracle耳机,新手耳机选购排行榜出炉,这三款耳机不仅做工精细,音质还能打