JSON格式报文加签/验签接口 保证顺序

8 篇文章 0 订阅
5 篇文章 0 订阅

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
    改变顺序
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值