FastJson轉Java對像欄位不區分大小寫

来源:https://www.cnblogs.com/wang1dao/archive/2023/06/02/17451390.html
-Advertisement-
Play Games

昨天遇到參數key大小寫不一致導致校驗簽名失敗的問題,查了很長時間才找到原因。看了一下FastJson源碼,發現JSON.toObject中轉換成對象的時候會忽略大小寫。 所以,當使用了JSON.toObject將json轉成Java對象後,再用JSON.toObject轉成json,key值就變了 ...


昨天遇到參數key大小寫不一致導致校驗簽名失敗的問題,查了很長時間才找到原因。看了一下FastJson源碼,發現JSON.toObject中轉換成對象的時候會忽略大小寫。

所以,當使用了JSON.toObject將json轉成Java對象後,再用JSON.toObject轉成json,key值就變了。

寫個方法驗證一下:

public class Person {
	private String nickName;

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	
}

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class JsonToObject {

	public static void main(String[] args) {
		JSONObject json1 = new JSONObject();
		json1.put("nickName", "shawn1");
		System.out.println(json1);
		Person p1 = json1.toJavaObject(Person.class);
		System.out.println(p1.getNickName());
		JSONObject json11 = (JSONObject)JSON.toJSON(p1);
		System.out.println(json11);
		System.out.println("--------------------");
		
		JSONObject json2 = new JSONObject();
		json2.put("nickname", "shawn2");
		System.out.println(json2);
		json2.toJavaObject(Person.class);
		Person p2 = json2.toJavaObject(Person.class);
		System.out.println(p2.getNickName());
		JSONObject json22 = (JSONObject)JSON.toJSON(p2);
		System.out.println(json22);
		System.out.println("--------------------");
		
		JSONObject json3 = new JSONObject();
		json3.put("nIcknAme", "shawn3");
		System.out.println(json3);
		json3.toJavaObject(Person.class);
		Person p3 = json3.toJavaObject(Person.class);
		System.out.println(p3.getNickName());
		JSONObject json33 = (JSONObject)JSON.toJSON(p3);
		System.out.println(json33);
		System.out.println("--------------------");
	}	

}

輸出:

{"nickName":"shawn1"}
shawn1
{"nickName":"shawn1"}
--------------------
{"nickname":"shawn2"}
shawn2
{"nickName":"shawn2"}
--------------------
{"nIcknAme":"shawn3"}
shawn3
{"nickName":"shawn3"}
--------------------

JSON.toObject中轉換成對象的時候忽略了大小寫,可以增強健壯性,但Java類是區分大小寫的,如果有兩個僅僅帶小寫不同的屬性,可能就出問題了。

給Person增加一個屬性再試一下:

public class Person {
	private String nickName;

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	
	private String nickname;

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	
}

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class JsonToObject {

	public static void main(String[] args) {
		JSONObject json1 = new JSONObject();
		json1.put("nickName", "shawn1");
		System.out.println(json1);
		Person p1 = json1.toJavaObject(Person.class);
		System.out.println("nickName:"+p1.getNickName()+"\t nickname:"+p1.getNickname());
		JSONObject json11 = (JSONObject)JSON.toJSON(p1);
		System.out.println(json11);
		System.out.println("--------------------");
		
		JSONObject json2 = new JSONObject();
		json2.put("nickname", "shawn2");
		System.out.println(json2);
		json2.toJavaObject(Person.class);
		Person p2 = json2.toJavaObject(Person.class);
		System.out.println("nickName:"+p2.getNickName()+"\t nickname:"+p2.getNickname());
		JSONObject json22 = (JSONObject)JSON.toJSON(p2);
		System.out.println(json22);
		System.out.println("--------------------");
		
		JSONObject json3 = new JSONObject();
		json3.put("nIcknAme", "shawn3");
		System.out.println(json3);
		json3.toJavaObject(Person.class);
		Person p3 = json3.toJavaObject(Person.class);
		System.out.println("nickName:"+p3.getNickName()+"\t nickname:"+p3.getNickname());
		JSONObject json33 = (JSONObject)JSON.toJSON(p3);
		System.out.println(json33);
		System.out.println("--------------------");
	}	

}

輸出:

{"nickName":"shawn1"}
nickName:shawn1	 nickname:null
{"nickName":"shawn1"}
--------------------
{"nickname":"shawn2"}
nickName:null	 nickname:shawn2
{"nickname":"shawn2"}
--------------------
{"nIcknAme":"shawn3"}
nickName:null	 nickname:shawn3
{"nickname":"shawn3"}
--------------------

這個結果符合你的預期嗎?

所以,用JSON.toObject的時候還是得慎重。

以上。

https://wangxuan.me/tech/2023/06/02/FastJson-convert-json-to-Java-Object-field-ignore-case.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 教程簡介 Excel是辦公室自動化中非常重要的一款軟體,Excel函數則是Excel中的內置函數。Excel函數共包含11類,分別是資料庫函數、日期與時間函數、工程函數、財務函數、信息函數、邏輯函數、查詢和引用函數、數學和三角函數、統計函數、文本函數以及用戶自定義函數。 熟練且高效的使用Exc ...
  • 前端組件 <hd-flex> <el-dialog v-model="isUploadDialog" width="50%" lock-scroll=false> <el-upload class="upload-demo" drag :action="url" :on-success="succe ...
  • 基於java的酒店管理系統設計與實現,酒店訂票系統,酒店預訂系統,酒店信息管理系統,app訂房系統設計與實現; ...
  • 本章將繼續探索內核中解析PE文件的相關內容,PE文件中FOA與VA,RVA之間的轉換也是很重要的,所謂的FOA是文件中的地址,VA則是記憶體裝入後的虛擬地址,RVA是記憶體基址與當前地址的相對偏移,本章還是需要用到`《驅動開發:內核解析PE結構導出表》`中所封裝的`KernelMapFile()`映射函... ...
  • 一致性哈希演算法是1997年由麻省理工的幾位學者提出的用於解決分散式緩存中的熱點問題。大家有沒有發現,我們之前介紹的例如快排之類的演算法是更早的六七十年代,此時分散式還沒有發展起來,大家往往還在提高單機性能。但是九十年代開始,逐漸需要用分散式集群來解決大型問題,相應的演算法研究也就應運而生。在說到一致性哈 ...
  • # 1.數值列表 列表非常適合用於存儲數字集合,而python提供了很多工具,可幫助我們高速地處理數字列表。 ## 1.1 range函數 python的range函數能夠輕鬆的生成連續一系列數字。 其語法格式:range(第一個數值,第二個數值) 編寫程式如下所示 ![image](https:/ ...
  • 時間序列數據是數據分析中一類常見且重要的數據。 它們按照時間順序記錄,通常是從某些現象的觀察中收集的,比如經濟指標、氣象數據、股票價格、銷售數據等等。 時間序列數據的特點是有規律地隨著時間變化而變化,它們的變化趨勢可以被分析和預測。時間序列分析是一種用於預測未來值或評估過去值的統計方法,常常被用於預 ...
  • 基於java的線上商城設計與實現,線上購物平臺,校園購物商城,商品銷售平臺,基於Java的電商平臺;電商平臺,買家和賣家可以在此平臺上進行銷售和交易,節約了大量的線下時間成本,購物車的功能,校園交易平臺等等; ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...