Java String转JSONObject时保持字段顺序不变

Java String转JSONObject时保持字段顺序不变

  • 问题背景
  • 解决方案

问题背景

在业务接口开发过程中,有一个新增接口,需要支持批量新增数据,这时入参就需要用到 json 格式数据,且包含 list 集合,比如这样的数据格式(整个数据是 String ),接口连接类似:http://www.test.com/url?data=urlEncode(String)

{"sign":"11111111111111","courseList":[{"courseCategory":"1021","courseSort":21,"courseTypeTwo":22,"courseLevel":"1","courseYear":"2023","isFreeCourse":0,"courseDuration":"142","courseId":"2023306111","courseTeacher":"张克1","courseCredit":"10.00","courseName":"中国特色社会主义思想"}],"schoolCode":"wx0001"}

通过调用接口传参之后需要将接收到的参数进行转换并用于后续业务逻辑处理,简单的说也就是将接收到的 String 转换成 JSONObject ,代码示例如下

 public static void main(String[] args) {String jsonString = "{\"sign\":\"11111111111111\",\"courseList\":[{\"courseCategory\":\"1021\",\"courseSort\":21,\"courseTypeTwo\":22,\"courseLevel\":\"1\",\"courseYear\":\"2023\",\"isFreeCourse\":0,\"courseDuration\":\"142\",\"courseId\":\"2023306111\",\"courseTeacher\":\"张克1\",\"courseCredit\":\"10.00\",\"courseName\":\"中国特色社会主义思想\"}],\"schoolCode\":\"wx0001\"}";System.out.println(jsonString);JSONObject jsonObject = JSON.parseObject(jsonString);System.out.println(JSON.toJSONString(jsonObject));}

执行main函数后的打印结果如下

{"sign":"11111111111111","courseList":[{"courseCategory":"1021","courseSort":21,"courseTypeTwo":22,"courseLevel":"1","courseYear":"2023","isFreeCourse":0,"courseDuration":"142","courseId":"2023306111","courseTeacher":"张克1","courseCredit":"10.00","courseName":"中国特色社会主义思想"}],"schoolCode":"wx0001"}{"sign":"11111111111111","courseList":[{"courseYear":"2023","courseName":"中国特色社会主义思想","courseLevel":"1","courseDuration":"142","courseTypeTwo":22,"courseCredit":"10.00","isFreeCourse":0,"courseTeacher":"张克1","courseId":"2023306111","courseCategory":"1021","courseSort":21}],"schoolCode":"wx0001"}

在这里插入图片描述
这里可以很明显的看到经过 JSON.parseObject(jsonString) 后的 JSONObject 再转换成 String 打印之后和之前的字符串参数顺序不一样了,那么通常情况下如果业务本身不关注参数顺序的话是没有影响的,但是接口调用时需要调用双方两边保持同样的入参顺序进行(入参+密钥+时间戳)的 MD5 加密,这样就会导致两边 MD5 后的字符串不一致,那么如何处理呢?

解决方案

这种情况下,想要保证同样的入参同样的加密方式同样的加密密钥加密出来的字符串一致的话,那就需要保证在接收到的入参字符串与传过来的入参一致, fastjson 支持这样的属性 Feature.OrderedField ,调整代码

public static void main(String[] args) {String jsonString = "{\"sign\":\"11111111111111\",\"courseList\":[{\"courseCategory\":\"1021\",\"courseSort\":21,\"courseTypeTwo\":22,\"courseLevel\":\"1\",\"courseYear\":\"2023\",\"isFreeCourse\":0,\"courseDuration\":\"142\",\"courseId\":\"2023306111\",\"courseTeacher\":\"张克1\",\"courseCredit\":\"10.00\",\"courseName\":\"中国特色社会主义思想\"}],\"schoolCode\":\"wx0001\"}";System.out.println(jsonString);JSONObject jsonObject = JSON.parseObject(jsonString, Feature.OrderedField);System.out.println(JSON.toJSONString(jsonObject));}

执行结果

{"sign":"11111111111111","courseList":[{"courseCategory":"1021","courseSort":21,"courseTypeTwo":22,"courseLevel":"1","courseYear":"2023","isFreeCourse":0,"courseDuration":"142","courseId":"2023306111","courseTeacher":"张克1","courseCredit":"10.00","courseName":"中国特色社会主义思想"}],"schoolCode":"wx0001"}{"sign":"11111111111111","courseList":[{"courseCategory":"1021","courseSort":21,"courseTypeTwo":22,"courseLevel":"1","courseYear":"2023","isFreeCourse":0,"courseDuration":"142","courseId":"2023306111","courseTeacher":"张克1","courseCredit":"10.00","courseName":"中国特色社会主义思想"}],"schoolCode":"wx0001"}

如图所示
在这里插入图片描述
这里可以看到的入参和接收后数据字符串顺序完全一样了,那么在进行后续的 JSONObject 再转换成 String 参与 MD5 加密也就能保证接口调用方和接口业务处理方两边的加密 sign 一致了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696726.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-磁盘管理类实训

一、Linux分区和磁盘操作命令 (1)将系统内所有的分区(文件系统)列出来) (2)将系统中所有特殊文件格式及名称都列出来 (3)将/bin下面的可以用的磁盘容量以易读的容量格式…

做抖店如何提高与达人合作的几率?有效筛选+有效推品

我是王路飞。 总是有很多新手商家,找我吐槽,抖音上的达人特别不好找,好不容易加上了,要么是发消息不回复,要么是寄样后就没下文了。 虽然一直都说找达人带货玩法比较简单,但也离不开电商的基本逻辑&#…

【数据可视化01】matplotlib实例介绍1

目录 一、引言二、实例介绍1.柱状图1)简单柱状图2)堆叠柱状图 2.线条形式3.折线图(多子图)4.散点图5.水平和垂直线条6.饼状图1)饼状图2)“条形饼”图 一、引言 matplotlib是一个用于绘制数据可视化的Python库。它可以创建各种静态…

制造业如何挖掘数据价值,附数据分析处理软件推荐

制造业如何挖掘和利用数据价值? 在信息化、智能化高速发展的今天,制造业正迎来一场由数据驱动的深刻变革。数据,作为这场变革的核心驱动力,正被制造业企业深度挖掘和利用,以实现更高效、更智能的生产模式。 制造业在利…

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波,QRS波群反映左、右心室除极电位和时间的变化,第一个向下的波为Q波,向上的波为R波,接着向下的波是S波。通过GUI进行数据处理,展示心率和QRS。程序已调通,可…

44.WEB渗透测试-信息收集-域名、指纹收集(6)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容: web指纹: 每一个网站,前端开发语言,后端语言&#…

【MySQL数据库开发设计规范】之字段设计规范

欢迎点开这篇文章,自我介绍一下哈,本人姑苏老陈 ,是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中,该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章,定期更新,欢迎关注&…

如何查看centos7是否安装nginx

要查看 CentOS 7 系统上是否安装了 Nginx,您可以使用多种方法来检查。以下是一些常见的方法: 通过 RPM 包管理器查询 在 CentOS 系统上,可以使用 RPM 包管理器来查询已安装的软件包。要查看是否安装了 Nginx,您可以在终端中运行以…

强化训练:day7(字符串中找出连续最长的数字串、岛屿数量、拼三角)

文章目录 前言1. 字符串中找出连续最长的数字串1.1 题目描述1.2 解题思路1.3 代码实现 2. 岛屿数量2.1 题目描述2.2 题目描述2.3 代码实现 3. 拼三角3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 字符串中找出连续最长的数字串   2. 岛屿数量   3. 拼三角 1. 字符串…

《系统管理学报》期刊投稿经验与流程分享(一轮退修,历时3月)

双非研二,三作(导师一作,师哥二作),《系统管理学报》期刊录用 投稿网址:https://xtglxb.sjtu.edu.cn/journalx_jgxb/authorLogOn.action 投稿&收稿:2022年12月26日初审:2023年…

ICode国际青少年编程竞赛- Python-3级训练场-条件练习

ICode国际青少年编程竞赛- Python-3级训练场-条件练习 1、 for i in range(5):Spaceship.step(2)Spaceship.turnLeft()Spaceship.step(2)Spaceship.turnRight()if i ! 0:Dev.step(-2)Dev.step(2)2、 for i in range(6):Dev.step(i1)Dev.turnLeft()if i ! 0 and i ! 1:Dev.s…

长难句打卡 5.13

And in Europe, some are up in arms over a proposal to drop a specific funding category for social-science research and to integrate it within cross-cutting topics of sustainable development. 在欧洲,有些人正竭力反对一项“终止专用于社会科学研究的…