JSON.toJSONString() map和對象 在序列化字符串之后 的順序問題


user{
        private int id

        private String addTime

        private String email

        private String password

        private String phone

}

接口方使用 @requestbody 接收參數將對象序列化為字符串進行加密  使用 使用:  JSON.toJSONString(User )   加密規則為 參數+固定的key進行  base64(md5(str))

結果為: {"addTime":1610978173026,"email":"112312312","id":1,"password":"125454","phone":"12121212"}

 

調用接口方沒有創建實體類,而是使用map手動創建的 如下:

Map<String,String> map = new LinkedHashMap<>();
map.put("addTime","1610977949556");
map.put("email","112312312");
map.put("id","1");
map.put("password","125454");
map.put("phone","12121212");

JSON.toJSONString(map )  后得到結果為: {"password":"125454","addTime":"1610977949556","phone":"12121212","id":"1","email":"112312312"}

可以看到數據已經不一致了  然后導致加密之后算出來的秘鑰 不一致 導致接口簽名錯誤

這里指的注意的是  JSON.toJSONString()  在對對象進行轉換時, 默認按照 字母的順序來排序的,(這里測試了,跟實體類的書寫順序和set的順序無關)

而 對map 進行轉換時, 順序是錯亂的,具體的順序我還沒找到

解決方案

  1. 讓調用方 建立一個請求對象在進行轉換
  2. 使用  LinkedHashMap  替換  HashMap 

注:內容從作者本人的CSDN重新整理過來的 所以圖片有水印

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM