支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码,Gson,Json,JSONObject,jackson对比DEMO

支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码

支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象
https://www.cnblogs.com/oktokeep/p/18249346

package com.example.core.mydemo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.core.mydemo.json2.GsonUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.HashMap;
import java.util.Map;

public class MapTest {
    private static final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static void main(String[] args) throws JsonProcessingException {
        /**
         * output:
         * {aaa=111, ccc=333, bbb=222}
         * gson={"aaa":"111","ccc":"333","bbb":"222"}
         * JSON={"aaa":"111","ccc":"333","bbb":"222"}
         * JSONObject={"aaa":"111","ccc":"333","bbb":"222"}
         */
        Map<String,String> map = new HashMap<>();
        map.put("aaa","111");
        map.put("bbb","222");
        map.put("ccc","333");
        System.out.println(map);

        System.out.println("gson="+gson.toJson(map));
        System.out.println("JSON="+JSON.toJSONString(map));
        JSONObject jsonObject = (JSONObject) JSON.toJSON(map);
        System.out.println("JSONObject="+jsonObject.toJSONString());

        /**
         * output:  结论:gson会转义编码符号,
         * ==符号错误,不一致
         * gson={"user":{"name":"刘德华","age":50,"url":"http://www.baidu.com/\u003d\u003d"},"sign":"签名串"}
         * gson-userJson={"name":"刘德华","age":50,"url":"http://www.baidu.com/=="}
         *
         * json字符串顺序不一致
         * JSON={"sign":"签名串","user":{"age":50,"name":"刘德华","url":"http://www.baidu.com/=="}}
         * JSON-userJson={"name":"刘德华","age":50,"url":"http://www.baidu.com/=="}
         *
         * 使用JSONObject是最优解。json字符串顺序和==符号都一致
         * JSONObject={"sign":"签名串","user":{"name":"刘德华","age":50,"url":"http://www.baidu.com/=="}}
         * JSONObject-userJson={"name":"刘德华","age":50,"url":"http://www.baidu.com/=="}
         *
         * 使用jackson也可以保持json字段顺序和==符号一致
         * MAPPER={"user":{"name":"刘德华","age":50,"url":"http://www.baidu.com/=="},"sign":"签名串"}
         * MAPPER-userJson={"name":"刘德华","age":50,"url":"http://www.baidu.com/=="}
         */
        User user = new User();
        user.setName("刘德华");
        user.setAge(50);
        user.setUrl("http://www.baidu.com/==");

        People people = new People();
        people.setUser(user);
        people.setSign("签名串");

        String json1 = new Gson().toJson(people);
        System.out.println("gson=" + json1);
        JSONObject JSONObject = JSON.parseObject(json1);
        String userJson = JSONObject.getString("user");
        System.out.println("gson-userJson=" + userJson);

        json1 = JSON.toJSONString(people);
        System.out.println("JSON=" + json1);

        JSONObject = JSON.parseObject(json1);
        userJson = JSONObject.getString("user");
        System.out.println("JSON-userJson=" + userJson);

        JSONObject jsonObject2 = (JSONObject) JSON.toJSON(people);
        json1 = jsonObject2.toJSONString();
        System.out.println("JSONObject=" + json1);

        JSONObject = JSON.parseObject(json1);
        userJson = JSONObject.getString("user");
        System.out.println("JSONObject-userJson=" + userJson);

        json1 = MAPPER.writeValueAsString(people);
        System.out.println("MAPPER=" + json1);

        JSONObject = JSON.parseObject(json1);
        userJson = JSONObject.getString("user");
        System.out.println("MAPPER-userJson=" + userJson);


    }
    static class People{
        User user;
        String sign;

        public User getUser() {
            return user;
        }

        public void setUser(User user) {
            this.user = user;
        }

        public String getSign() {
            return sign;
        }

        public void setSign(String sign) {
            this.sign = sign;
        }
    }
    static class User{
        private String name;
        private Integer age;
        private String url;

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }
}

 

posted on 2024-06-15 15:27  oktokeep  阅读(33)  评论(2编辑  收藏  举报