欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中@JsonValue和@JsonCreator使用

 更新時(shí)間:2024年06月12日 10:14:11   作者:康提扭狗兔  
本文主要介紹了java中@JsonValue和@JsonCreator使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

@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解決分析

    這篇文章主要為大家介紹了Java報(bào)錯(cuò)Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • mybatis-plus如何使用mapper的xml

    mybatis-plus如何使用mapper的xml

    這篇文章主要介紹了mybatis-plus如何使用mapper的xml問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java 橋模式(Bridge Pattern)詳解

    java 橋模式(Bridge Pattern)詳解

    這篇文章主要介紹了java 橋模式(Bridge Pattern)詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Mybatis-Plus根據(jù)時(shí)間段去查詢數(shù)據(jù)的實(shí)現(xiàn)示例

    Mybatis-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-04
  • SpringBoot之ApplicationRunner解析(spring容器啟動(dòng)完成執(zhí)行的類)

    SpringBoot之ApplicationRunner解析(spring容器啟動(dòng)完成執(zhí)行的類)

    這篇文章主要介紹了SpringBoot之ApplicationRunner解析(spring容器啟動(dòng)完成執(zhí)行的類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring Cloud Stream簡(jiǎn)單用法

    Spring Cloud Stream簡(jiǎn)單用法

    Spring cloud stream是為構(gòu)建微服務(wù)消息驅(qū)動(dòng)而產(chǎn)生的一種框架。Spring Cloud Stream基于Spring boot的基礎(chǔ)上,可創(chuàng)建獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用,并采用Spring Integration來(lái)連接消息中間件提供消息事件驅(qū)動(dòng),一起看看吧
    2021-07-07
  • 使用synchronized關(guān)鍵字實(shí)現(xiàn)信號(hào)量的方法

    使用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-04
  • Java雙向鏈表的操作

    Java雙向鏈表的操作

    這篇文章主要介紹了Java雙向鏈表的操作,雙向鏈表,對(duì)于該鏈表中的任意節(jié)點(diǎn),既可以通過(guò)該節(jié)點(diǎn)向前遍歷,也可以通過(guò)該節(jié)點(diǎn)向后遍歷,雙向鏈表在實(shí)際工程中應(yīng)用非常廣泛,是使用鏈表這個(gè)結(jié)構(gòu)的首選
    2022-06-06
  • Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié)

    Springboot 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-04
  • Java中常用解析工具jackson及fastjson的使用

    Java中常用解析工具jackson及fastjson的使用

    今天給大家?guī)?lái)的是關(guān)于Java解析工具的相關(guān)知識(shí),文章圍繞著jackson及fastjson的使用展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論