最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中@JsonValue和@JsonCreator使用

 更新時間:2024年06月12日 10:14:11   作者:康提扭狗兔  
本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

最新評論

精河县| 天台县| 分宜县| 乌海市| 邯郸县| 温泉县| 永新县| 阳信县| 长岭县| 财经| 晋州市| 曲沃县| 武隆县| 安福县| 左云县| 十堰市| 荔浦县| 迁西县| 滨州市| 德庆县| 松原市| 扶余县| 凤台县| 米林县| 台中市| 金溪县| 乡城县| 赤水市| 新和县| 镇原县| 三江| 日喀则市| 内丘县| 视频| 富源县| 吴忠市| 凤凰县| 巩义市| 辽阳县| 瑞丽市| 诸城市|