java中@JsonValue和@JsonCreator使用
@JsonValue
可以用在get方法或者屬性字段上,一個(gè)類只能用一個(gè),當(dāng)加上@JsonValue注解時(shí),該類的json化結(jié)果,只有這個(gè)get方法的返回值,而不是這個(gè)類的屬性鍵值對(duì).
@JsonCreator
當(dāng)json在反序列化時(shí),默認(rèn)選擇類的無(wú)參構(gòu)造函數(shù)創(chuàng)建類對(duì)象,沒(méi)有無(wú)參構(gòu)造函數(shù)時(shí)會(huì)報(bào)錯(cuò),@JsonCreator作用就是指定一個(gè)有參構(gòu)造函數(shù)供反序列化時(shí)調(diào)用。
該構(gòu)造方法的參數(shù)前面需要加上@JsonProperty,否則會(huì)報(bào)錯(cuò)。
當(dāng)實(shí)體類中的屬性為枚舉類型時(shí),將其序列化成json字符串傳給前端,傳遞的應(yīng)該是有效的值而不是枚舉常量。
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. 問(wèn)題引出
2.1 序列化
當(dāng)一個(gè)對(duì)象為
Student(id=1, userName=hahaha, telephone=null, email=hahaha@233.com, sex=FEMALE)
將其序列化為json字符串傳遞給前端時(shí),sex字段應(yīng)該轉(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應(yīng)該轉(zhuǎn)換成int型1002。
code為有效值,在上面加個(gè) @JsonValue 注解就行。
2.2 反序列化
同樣,
當(dāng)前端傳過(guò)來(lái)的json字符串為
{"id":1,"userName":"hahaha","telephone":"12312311122","sex":1002,"email":"hahaha@233.com"}
時(shí),后端應(yīng)該序列化為
Student(id=1, userName=hahaha, telephone=null, email=hahaha@233.com, sex=FEMALE)
對(duì)象,否則會(huì)報(bào)錯(cuò)
因此需要用 @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. 改進(jìn)序列化后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. 測(cè)試
import com.alibaba.nacos.common.utils.JacksonUtils; import org.junit.jupiter.api.Test; public class JacksonTest { // 序列化實(shí)體類,即后端to前端的過(guò)程。 @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); } }
需要注意的是,以上的注解存在于依賴包c(diǎn)om.fasterxml.jackson.annotation下,因此有些不是基于com.fasterxml.jackson的json序列化工具類可能不支持這兩個(gè)注解。
比如說(shuō)com.alibaba.fastjson.JSON就不支持這兩個(gè)注解。
到此這篇關(guān)于java中@JsonValue和@JsonCreator使用的文章就介紹到這了,更多相關(guān)java @JsonValue @JsonCreator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java報(bào)錯(cuò)Non-terminating?decimal?expansion解決分析
這篇文章主要為大家介紹了Java報(bào)錯(cuò)Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Mybatis-Plus根據(jù)時(shí)間段去查詢數(shù)據(jù)的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis-Plus根據(jù)時(shí)間段去查詢數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SpringBoot之ApplicationRunner解析(spring容器啟動(dòng)完成執(zhí)行的類)
這篇文章主要介紹了SpringBoot之ApplicationRunner解析(spring容器啟動(dòng)完成執(zhí)行的類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05使用synchronized關(guān)鍵字實(shí)現(xiàn)信號(hào)量的方法
在Java中,信號(hào)量(Semaphore)是一種常用的同步工具,它可以用來(lái)控制對(duì)共享資源的訪問(wèn)數(shù)量,下面,我們將使用Synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的信號(hào)量,我們的目標(biāo)是實(shí)現(xiàn)一個(gè)計(jì)數(shù)信號(hào)量,其中信號(hào)量的計(jì)數(shù)指示可以同時(shí)訪問(wèn)某一資源的線程數(shù),需要的朋友可以參考下2024-04-04Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java中常用解析工具jackson及fastjson的使用
今天給大家?guī)?lái)的是關(guān)于Java解析工具的相關(guān)知識(shí),文章圍繞著jackson及fastjson的使用展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06