java中@JsonValue和@JsonCreator使用

 更新时间:2024年06月12日 10:14:11   作者:康提扭狗兔  
本文主要介绍了java中@JsonValue和@JsonCreator使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

@JsonValue
可以用在get方法或者属性字段上,一个类只能用一个,当加上@JsonValue注解时,该类的json化结果,只有这个get方法的返回值,而不是这个类的属性键值对.

@JsonCreator
当json在反序列化时,默认选择类的无参构造函数创建类对象,没有无参构造函数时会报错,@JsonCreator作用就是指定一个有参构造函数供反序列化时调用。
该构造方法的参数前面需要加上@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字段应该转成下面哪种形式?

{"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应该转换成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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java报错Non-terminating decimal expansion解决分析

    Java报错Non-terminating decimal expansion解决分析

    这篇文章主要为大家介绍了Java报错Non-terminating decimal expansion解决方案及原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • mybatis-plus如何使用mapper的xml

    mybatis-plus如何使用mapper的xml

    这篇文章主要介绍了mybatis-plus如何使用mapper的xml问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java 桥模式(Bridge Pattern)详解

    java 桥模式(Bridge Pattern)详解

    这篇文章主要介绍了java 桥模式(Bridge Pattern)详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • Mybatis-Plus根据时间段去查询数据的实现示例

    Mybatis-Plus根据时间段去查询数据的实现示例

    这篇文章主要介绍了Mybatis-Plus根据时间段去查询数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    这篇文章主要介绍了SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring Cloud Stream简单用法

    Spring Cloud Stream简单用法

    Spring cloud stream是为构建微服务消息驱动而产生的一种框架。Spring Cloud Stream基于Spring boot的基础上,可创建独立的、生产级别的Spring应用,并采用Spring Integration来连接消息中间件提供消息事件驱动,一起看看吧
    2021-07-07
  • 使用synchronized关键字实现信号量的方法

    使用synchronized关键字实现信号量的方法

    在Java中,信号量(Semaphore)是一种常用的同步工具,它可以用来控制对共享资源的访问数量,下面,我们将使用Synchronized关键字来实现一个简单的信号量,我们的目标是实现一个计数信号量,其中信号量的计数指示可以同时访问某一资源的线程数,需要的朋友可以参考下
    2024-04-04
  • Java双向链表的操作

    Java双向链表的操作

    这篇文章主要介绍了Java双向链表的操作,双向链表,对于该链表中的任意节点,既可以通过该节点向前遍历,也可以通过该节点向后遍历,双向链表在实际工程中应用非常广泛,是使用链表这个结构的首选
    2022-06-06
  • Springboot Maven打包跳过测试的五种方式小结

    Springboot Maven打包跳过测试的五种方式小结

    本文主要介绍了Springboot Maven打包跳过测试的五种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java中常用解析工具jackson及fastjson的使用

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

    今天给大家带来的是关于Java解析工具的相关知识,文章围绕着jackson及fastjson的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论