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.mzph.cn/bicheng/12515.shtml

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

相关文章

windows11 Django环境安装

相关文档 1、验证python和pip3环境 C:\Users\Administrator>python Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for…

基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..............................................................I0 imresize…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30:0P34:1然后高流向低,P34:0,刚开始是0xf0:1111 0000 后面是0xe0:1110 0000 ,当是0xe0能确…

MySQL用SQL取三列中最大的数据值

1、有如下数据: ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式: ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南

Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关? 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一,退一还三”的机制,平衡三进制与之类似,但就是偏移了一下变得对称了,平衡三进制与标准三进制可以相互转换,但这样显得有点多余了,所以这里只讲平衡三进制与十进制的转换。 数字系统的…

数据结构与算法-排序算法3-插入排序

目录 1.插入排序: 1.介绍: 2.动态图解 3.举例 4.小结插入排序规则 5.插入排序代码 6.运行时间 代码: 运行结果: 1.插入排序: 1.介绍: 数组中n个元素,把这n个待排序元素看成一个有序序…

(Java面试题——基础版)JVM、JRE和JDK的关系

JVM Java Virtual Machine是Java虚拟机 ,Java程序需要运行在虚拟机上 ,不同的平台有自己的虚拟机 ,因此Java语言可以 实现跨平台。JVM 负责将 Java 字节码(即编译后的 .class 文件)翻译成特定平台上的机器码&#xff0…

直播预告-如何快乐学习亚马逊云科技AWS,玩游戏备考亚马逊云科技云从业者认证?

一边玩一边学习亚马逊云科技云技能,这么好的事尊的假的?本周六(5约11日)晚20点,亚马逊云科技UG云端夜话Night Talk活动精彩回归~ 本次亚马逊云科技UG云端夜话直播是什么? 小李哥这次将在多平台…

分析 vs2019 cpp20 规范的 STL 库模板 function ,源码注释并探讨几个问题

(1 探讨一)第一个尝试弄清的问题是父类模板与子类模板的模板参数的对应关系,如下图: 我们要弄清的问题是创建 function 对象时,传递的模板参数 _Fty , 传递到其父类 _Func_class 中时 ,父类的模板参数 _Ret…

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

基础知识要求: Java:方法、while循环、for循环 Python: 方法、while循环、for循环 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head […

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java ,C, 测开,整体来说三个方向难度相当。 1.仅从语法角度来看,c 是掌控一切,知识都要懂一点,而java的特点在于省心,都封装…

【C++小语法】引用和内联函数(完结篇)

在使用C语言编程过程中,C语言的要求之严格,编程过程之繁琐,大同小异的重复性工作,令C之父使用C语言编程时也深受其扰,于是乎C兼容C小语法诞生了 一、引用 1.引用概念 在C中,引用(Reference&am…

【Android踩坑】 Constant expression required

gradle 8,报错 Constant expression required:意思是case语句后面要跟常量 解决1 单击switch语句,键盘按下altenter,将switch-case语句替换为if-else语句(或者手动修改) 解决2 在gradle.properties中添加 android.nonFinalRes…

【卫星影像三维重建随记】obj模型及其纹理材质文件介绍

obj模型及纹理材质介绍 1.介绍1.1 背景1.2 带有纹理色彩的obj三维模型 2.带有纹理信息obj三维模型文件解析2.1 三维模型数据2.2 obj文件内容2.3mtl文件内容 3 参考 1.介绍 1.1 背景 OBJ格式是一种简单且通用的三维模型文件格式,支持多边形网格和基本的几何体类型&…

leetcode.K站中转(python)

开始准备用dfs深度搜索,发现n100,dfs可能会超时,即使用了剪枝。 class Solution:def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:length k 2ans float(inf)rec []vis [True]*n…

Golang RPC实现-day01

导航 Golang RPC实现一、主体逻辑设计二、服务设计1、监听和接收请求2、处理请求(1)服务结构体定义(2)确认请求方和服务方编解码格式(3)循环读取请求(4)解析请求的内容(5)响应请求 三、读取和发送数据到连接中代码 Golang RPC实现 先来一个最简单的版本,后续更新。…

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

sklearn中多分类和多标签分类评估方法总结

一、任务区分 多分类分类任务:在多分类任务中,每个样本只能被分配到一个类别中。换句话说,每个样本只有一个正确的标签。例如,将图像分为不同的物体类别,如猫、狗、汽车等。 多标签分类任务:在多标签分类任…