java中@JsonValue和@JsonCreator使用
@JsonValue
可以用在get方法或者屬性字段上,一個類只能用一個,當加上@JsonValue注解時,該類的json化結(jié)果,只有這個get方法的返回值,而不是這個類的屬性鍵值對.
@JsonCreator
當json在反序列化時,默認選擇類的無參構(gòu)造函數(shù)創(chuàng)建類對象,沒有無參構(gòu)造函數(shù)時會報錯,@JsonCreator作用就是指定一個有參構(gòu)造函數(shù)供反序列化時調(diào)用。
該構(gòu)造方法的參數(shù)前面需要加上@JsonProperty,否則會報錯。
當實體類中的屬性為枚舉類型時,將其序列化成json字符串傳給前端,傳遞的應該是有效的值而不是枚舉常量。
1. Get-Started
@Data public class Student { private Long id; private String userName; private String telephone; private String email; private SexEnum sex; }
public enum SexEnum { UNKNOWN(0, "未知"), MALE(1001, "男性"), FEMALE(1002, "女性"), NOMALE(1003, "妖怪"); private int code; private String desc; SexEnum(int code, String desc) { this.code = code; this.desc = desc; } }
2. 問題引出
2.1 序列化
當一個對象為
Student(id=1, userName=hahaha, telephone=null, email=hahaha@233.com, sex=FEMALE)
將其序列化為json字符串傳遞給前端時,sex字段應該轉(zhuǎn)成下面哪種形式?
{"id":1,"userName":"hahaha","telephone":"12312311122","email":"hahaha@233.com","sex":"FEMALE"} {"id":1,"userName":"hahaha","telephone":"12312311122","email":"hahaha@233.com","sex":1002}
顯然,枚舉量sex=FEMALE應該轉(zhuǎn)換成int型1002。
code為有效值,在上面加個 @JsonValue 注解就行。
2.2 反序列化
同樣,
當前端傳過來的json字符串為
{"id":1,"userName":"hahaha","telephone":"12312311122","sex":1002,"email":"hahaha@233.com"}
時,后端應該序列化為
Student(id=1, userName=hahaha, telephone=null, email=hahaha@233.com, sex=FEMALE)
對象,否則會報錯
因此需要用 @JsonCreator 注解自定義反序列化方式,示例如下
@JsonCreator public static SexEnum forValue(Integer value) { SexEnum[] values = SexEnum.values(); return Stream.of(values).filter(it -> it.getCode()==(value)).findAny().orElse(UNKNOWN); }
3. 改進序列化后enum代碼
@Getter public enum SexEnum { UNKNOWN(0, "未知"), MALE(1001, "男性"), FEMALE(1002, "女性"), NOMALE(1003, "妖怪"); @JsonValue private int code; private String desc; SexEnum(int code, String desc) { this.code = code; this.desc = desc; } @JsonCreator public static SexEnum forValue(Integer value) { SexEnum[] values = SexEnum.values(); return Stream.of(values).filter(it -> it.getCode()==(value)).findAny().orElse(UNKNOWN); } }
4. 測試
import com.alibaba.nacos.common.utils.JacksonUtils; import org.junit.jupiter.api.Test; public class JacksonTest { // 序列化實體類,即后端to前端的過程。 @Test public void test01(){ Student student = new Student(); student.setId(1L); student.setEmail("hahaha@233.com"); student.setTelephone("12312311122"); student.setUserName("hahaha"); student.setSex(SexEnum.FEMALE); String json = JacksonUtils.toJson(student); System.out.println(json); } // @JsonCreator 反序列化 @Test public void test02(){ String json = "{\"id\":1,\"userName\":\"hahaha\",\"telphone\":\"12312311122\",\"sex\":1002,\"email\":\"hahaha@233.com\"}"; Student obj = JacksonUtils.toObj(json, Student.class); System.out.println(obj); } }
需要注意的是,以上的注解存在于依賴包com.fasterxml.jackson.annotation下,因此有些不是基于com.fasterxml.jackson的json序列化工具類可能不支持這兩個注解。
比如說com.alibaba.fastjson.JSON就不支持這兩個注解。
到此這篇關于java中@JsonValue和@JsonCreator使用的文章就介紹到這了,更多相關java @JsonValue @JsonCreator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java報錯Non-terminating?decimal?expansion解決分析
這篇文章主要為大家介紹了Java報錯Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Mybatis-Plus根據(jù)時間段去查詢數(shù)據(jù)的實現(xiàn)示例
這篇文章主要介紹了Mybatis-Plus根據(jù)時間段去查詢數(shù)據(jù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04SpringBoot之ApplicationRunner解析(spring容器啟動完成執(zhí)行的類)
這篇文章主要介紹了SpringBoot之ApplicationRunner解析(spring容器啟動完成執(zhí)行的類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05使用synchronized關鍵字實現(xiàn)信號量的方法
在Java中,信號量(Semaphore)是一種常用的同步工具,它可以用來控制對共享資源的訪問數(shù)量,下面,我們將使用Synchronized關鍵字來實現(xiàn)一個簡單的信號量,我們的目標是實現(xiàn)一個計數(shù)信號量,其中信號量的計數(shù)指示可以同時訪問某一資源的線程數(shù),需要的朋友可以參考下2024-04-04Springboot Maven打包跳過測試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過測試的五種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04Java中常用解析工具jackson及fastjson的使用
今天給大家?guī)淼氖顷P于Java解析工具的相關知識,文章圍繞著jackson及fastjson的使用展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06