JSON格式报文加签/验签接口
概述
最近项目中遇到针对接口数据加签/验签的需求,如何保证接受到的字符串的顺序和发送的顺序一致,只有这样才能保证验签成功。
需要将JSON字符串转换成map对象,获取map中的业务数据,如果map存在嵌套,只针对第一层进行自然排序,然后进行签名验证。
验证JSON转换工具
工具
- fastJson
- gson
- hutool
目标
-
JSON字符串转Map是否保证原来的顺序
-
Map转JSON字符串是否保证原来的顺序
代码
package com.sedaier.test.tool.json.compare;
import java.lang.reflect.Type;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
public class CompareJson {
public static void main(String[] args) {
String inPara = "{\r\n" +
" \"data\": {\r\n" +
" \"srvvCode\": \"TTTT_002690\",\r\n" +
" \"tranvsType\": null,\r\n" +
" \"bankvAcct\": \"2057811077\",\r\n" +
" \"detNvum\": \"1\",\r\n" +
" \"acctOvrgNo\": \"33240330\",\r\n" +
" \"detLivst\": [\r\n" +
" {\r\n" +
" \"covnsAcct\": \"19520440008907\",\r\n" +
" \"senvdDate\": \"20220518\",\r\n" +
" \"dbcvrFlag\": \"02\",\r\n" +
" \"arrviveDate\": \"20220516\",\r\n" +
" \"amvt\": \"60762.64\",\r\n" +
" \"postvScripsts\": \"HUOQU费\",\r\n" +
" \"consvName\": \"交通建材有限公司\",\r\n" +
" \"consvBank\": \"0\",\r\n" +
" \"bankNvoteNo\": \"22136012100334\",\r\n" +
" \"remavrks\": \"HUOQU费\"\r\n" +
" }\r\n" +
" ],\r\n" +
" \"serivalNo\": \"I20220518175728\",\r\n" +
" \"channevlCode\": \"ICC\"\r\n" +
" },\r\n" +
" \"servivcveCode\": \"20000425\",\r\n" +
" \"sourcve\": \"\",\r\n" +
" \"targvet\": \"331101\"\r\n" +
"}";
//gson
//不改变顺序
Gson json = new Gson();
Type type = new TypeToken<Map<String,Object>>() {
}.getType();
Map fromJson = json.fromJson(inPara, type);
System.out.println(fromJson);
//fastjson
//改变了顺序
Map parseObject = JSONObject.parseObject(inPara, Map.class);
System.out.println(parseObject);
//hutool
//改变顺序
Map bean = JSONUtil.toBean(inPara, Map.class);
System.out.println(bean);
//没有改变顺序
JSON parse = JSONUtil.parse(inPara, JSONConfig.create().setOrder(true).setIgnoreNullValue(false));
Map bean2 = parse.toBean(Map.class);
System.out.println(bean2);
// Map<String,Object> data = new HashMap<String,Object>();
// Map<String,Object> out = new HashMap<String,Object>();
// Map<String,Object> tree = new TreeMap<String,Object>();
// List<Map<String,Object>> inList = new ArrayList<Map<String,Object>>();
// Map<String,Object> inner = new HashMap<String,Object>();
// out.put("srvCvode", "TTTvT_002690");
// out.put("bankAvcct", "2020v57811077");
// out.put("detNuvm", "1");
// out.put("acctvOrgNo", "3341210330");
// out.put("seriavlNo", "1");
// out.put("detNuvm", "I20220518175728");
// out.put("channevlCode", "ICB121C");
// data.put("data", out);
// data.put("servviceCode", "200425");
// data.put("sourvce", "");
// data.put("targvet", "331101");
inner.put("senvdDate", "202120518");
inner.put("amvt", "607612.64");
inner.put("arrviveDate", "202201516");
inner.put("consvName", "交通建材有限公司");
inner.put("consvAcct", "19520401211040008907");
inner.put("dbcrFvlag", "02");
inner.put("postSvcripsts", "水费");
inner.put("consBvank", "0");
inner.put("bankNoteNo", "22121136000334");
inner.put("remavrks", "水费费");
// tree.put("amvt", "607162.64");
// tree.put("arrivveDate", "202201516");
// tree.put("consNvame", "交通建材有限公司");
// tree.put("consvAcct", "19520140112121040008907");
// tree.put("dbcrFvlag", "02");
// tree.put("postvScripsts", "水费");
// tree.put("consBvank", "0");
// tree.put("bankNvoteNo", "22131216000334");
// tree.put("remarvks", "水费费");
// out.put("detList", inList);
// //inList.add(inner);
// inList.add(tree);
// System.out.println(data);
// //不改变顺序
// Gson go = new Gson();
// String json = go.toJson(data);
// System.out.println(json);
//
// //不改变顺序
// String jsonString = JSONObject.toJSONString(data);
// System.out.println(jsonString);
//
// //改变顺序
// String jsonStr = JSONUtil.toJsonStr(data);
// System.out.println(jsonStr);
}
}
验证结果
-
JSON字符串->Map
//gson 不改变顺序 //fastjson 改变顺序 //hutool 改变顺序
-
Map->JSON字符串
//gson 不改变顺序 //fastjson 不改变顺序 //hutool 改变顺序