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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis一對多關聯(lián)關系映射實現(xiàn)過程解析
這篇文章主要介紹了Mybatis一對多關聯(lián)關系映射實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
SpringBoot整合spring-retry實現(xiàn)接口請求重試機制及注意事項
今天通過本文給大家介紹我們應該如何使用SpringBoot來整合spring-retry組件實現(xiàn)重試機制及注意事項,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-08-08
詳解Java從后臺重定向(redirect)到另一個項目的方法
這篇文章主要介紹了詳解Java從后臺重定向(redirect)到另一個項目的方法,非常具有實用價值,需要的朋友可以參考下2017-04-04
java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實現(xiàn)的日期時間轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關操作與封裝技巧,需要的朋友可以參考下2019-10-10

