@JsonCreator和@JsonValue

news2024/12/26 23:17:13

文章目录

  • 1、正常反序列化的过程
  • 2、@JsonCreator
  • 3、@JsonValue
  • 4、应用:枚举类中校验传参以及优化前后端数据交互
  • 5、补充:@ConstructorProperties

1、正常反序列化的过程

反序列化时,默认会调用实体类的无参构造来实例化一个对象,然后使用setter来初始化属性值。写点测试代码:

@AllArgsConstructor
@Data
public class Book {

    private String name;

    private Double price;

}

测试下:

public class TestSome1 {

    @Test
    void testJson() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Book book = objectMapper.readValue("{\n" +
                "    \"name\":\"Java\",\n" +
                "    \"price\":666.00\n" +
                "}", Book.class);
        System.out.println(book);
       
    }
}

此时,运行会抛出InvalidDefinitionException:

在这里插入图片描述

2、@JsonCreator

@JsonCreator可用在:

  • 构造方法上
  • 静态的工厂方法上

加了@JsonCreator注解,该类的对象在反序列化时,就走有@JsonCreator注解的方法来反序列化,原先无参+set的过程失效。

上面的Book类,可改成:

//@AllArgsConstructor
@Getter
public class Book {

    private String name;

    private Double price;

    @JsonCreator
    public Book(@JsonProperty("name") String name,@JsonProperty("price") Double price ){
        System.out.println("@JsonCreator生效");
        this.name = name;
        this.price = price+1;
    }
   
}

上面的@JsonProperty注解就是指定传参名和对象属性关系的,有点像MyBatis的@Param

 public Book(@JsonProperty("name") String name,@JsonProperty("price") Double price ){

@JsonCreator放在静态方法上就是:

@AllArgsConstructor
@Getter
public class Book {

    private String name;

    private Double price;

    @JsonCreator
    public static Book unSerialize(){
        System.out.println("正在反序列化成对象");
        return new Book("111",1.00);
    }

   
}

以@JsonCreator放在构造方法上为例,再运行前面的单元测试,看下反序列化的效果:

在这里插入图片描述

3、@JsonValue

@JsonValue注解可用在:

  • get方法
  • 属性字段上

一个类只能用一个,加上这个注解时,该类的对象序列化时就会只返回这个字段的值做为序列化的结果。

比如一个枚举类的get方法上加上该注解,那么在序列化这个枚举类的对象时,返回的就是枚举对象的这个属性,而不是这个枚举对象的序列化json串。继续改造上面的Book类:

@AllArgsConstructor
@Getter
public class Book {

    //@JsonValue,加get方法或者这个属性上,都一样
    private String name;

    private Double price;

    @JsonCreator
    public static Book doSerialize(){
        System.out.println("正在反序列化成对象");
        return new Book("111",1.00);
    }

    /**
     * 序列化时,序列化成我return的值,即当前对象的name属性
     */
    @JsonValue
    public String getName(){
        return this.name;
    }
}

单元测试中看下效果:

public class TestSome1 {

    @Test
    void testJson() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Book book = objectMapper.readValue("{\n" +
                "    \"name\":\"Java\",\n" +
                "    \"price\":666.00\n" +
                "}", Book.class);
        System.out.println(book);
        System.out.println("=======");
        //序列化
        System.out.println(objectMapper.writeValueAsString(book));
    }
}

在这里插入图片描述

4、应用:枚举类中校验传参以及优化前后端数据交互

比如定义一个排序字段的枚举类,排序字段要拼到mapper层的SQL,所以其传参的合法性必须校验,每次在Service层校验,很繁琐。引入@JsonCreator:

@AllArgsConstructor
@Getter
public enum OrderFieldEnum {

    CREATE_TIME("createTime","create_time"),
    USER_NAME("userName","user_name");

    private final String value;
    private final String field;
    private static final Map<String,OrderFieldEnum> map = new HashMap<>(3);

    @JsonCreator
    public static OrderFieldEnum unSerializer(String value){
    	//把以value为key,以枚举对象为value,存进map
        if(map.isEmpty()){
            for (OrderFieldEnum fieldEnum : OrderFieldEnum.values()) {
                map.put(fieldEnum.value,fieldEnum);
            }
        }
        //map中找不到就是超出范围
        if(!map.containsKey(value)){
            throw new RuntimeException("超出范围");
        }
        return map.get(value);
    }

    @JsonValue
    public String getValue(){
        return this.value+"@JsonValue";   //这里刻意加个@JsonValue,方便后面验证序列化效果。return this.value就行。
    }


}

此时,前端传个dto(json)过来,dto里有个参数的类型是枚举类型,反序列化json成dto对象时,枚举类型的属性也会反序列化,上面@JsonCreator定义的unSerializer方法执行,就会完成参数合法性校验,Service层省事了。至于序列化:

@JsonValue
public String getValue(){
    return this.value;
}

比如需要返给前端枚举值展示下拉框,就直接Vo里就直接List<Enum> enumList,而不用定义个List<String> enumList,再反复getValue:

enumList.add(ENUM1.getValue)  
enumList.add(ENUM2.getValue)
...

因为返给前端时,Vo对象序列化,里面的一个个枚举对象也序列化,而JsonValue已经指定了序列化枚举对象时就把它的value返回就行。写个简单接口看下效果,定义个dto:

@Data
public class JsonDto {

    private String id;

    private OrderFieldEnum orderField;
}

Service层demo:

@Service
public class MyService {

    public List<OrderFieldEnum> listValue(JsonDto dto){
        System.out.println(dto.getOrderField());
        //直`List<Enum>
        List<OrderFieldEnum> list = List.of(OrderFieldEnum.CREATE_TIME, OrderFieldEnum.USER_NAME);
        return list;
    }
}

controller:

@RestController
public class CodeController {

    @Resource
    private MyService myService;

    @PostMapping("/test")
    public List<OrderFieldEnum> getStr(@RequestBody JsonDto dto){

        return myService.listValue(dto);
    }
}

异常传参时:

在这里插入图片描述

正常传参:

在这里插入图片描述

此时,不管枚举类型啥的,前端传个String就行。最后,注解的依赖坐标引对:

在这里插入图片描述

5、补充:@ConstructorProperties

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树题目:具有所有最深结点的最小子树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;具有所有最深结点的最小子树 出处&#xff1a;865. 具有所有最深结点的最小子树 难度 5 级 题目描述 要求 给定…

web前端开发基础------外边距折叠现象

引言 在设置样式时&#xff0c;需要遵循先整体再细节&#xff0c;先通用样式再特殊样式的顺序进行设置 一&#xff0c;什么是外边距折叠现象呢&#xff1f; 外边距折叠 定义&#xff1a; 外边距折叠是指相邻的两个或者多个外边距&#xff08;margin&#xff09;在垂直方向会合并…

分布式锁之基于mysql实现分布式锁(四)

不管是jvm锁还是mysql锁&#xff0c;为了保证线程的并发安全&#xff0c;都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 可以利用唯一键索引不能重复插入的特点实现。设计表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

最小二乘线性回归

​ 线性回归&#xff08;linear regression&#xff09;&#xff1a;试图学得一个线性模型以尽可能准确地预测实际值的输出。 以一个例子来说明线性回归&#xff0c;假设银行贷款会根据 年龄 和 工资 来评估可放款的额度。即&#xff1a; ​ 数据&#xff1a;工资和年龄&…

企业必看的大数据安全极速传输解决方案

在这个大数据时代&#xff0c;企业在享受大数据带来的便利同时&#xff0c;也面临着巨大的挑战&#xff0c;其中最主要的问题就是数据安全方面和传输方面&#xff0c;为了更好地满足企业大数据传输的需求&#xff0c;小编将深入分析企业对于大数据传输面临的挑战和风险以及大数…

[PTQ]均匀量化和非均匀量化

均匀量化和非均匀量化 基本概念 量化出发点&#xff1a;使用整型数据类型代替浮点数据&#xff0c;从而节省存储空间同时加快推理速度。量化基本形式 均匀量化&#xff1a;浮点线性映射到定点整型上&#xff0c;可以根据scale/offset完成量化/反量化操作。非均匀量化 PowersO…

containerd Snapshots功能解析

containerd Snapshots功能解析 snapshot是containerd的一个核心功能&#xff0c;用于创建和管理容器的文件系统。 本篇containerd版本为v1.7.9。 本文以 ctr i pull命令为例&#xff0c;分析containerd的snapshot “创建” 相关的功能。 ctr命令 ctr image相关命令的实现在cmd…

OpenAI“宫斗”新进展!Sam Altman将重返OpenAI担任首席执行官 董事会成员改动

在经过激烈的五天讨论和辩论之后&#xff0c;高调人工智能初创公司OpenAI宣布&#xff0c;其联合创始人之一Sam Altman将回归担任首席执行官。这一决定是对上周Altman突然被解雇的回应&#xff0c;该决定引起了极大的关注和讨论。 OpenAI表示&#xff0c;他们已经达成了与Altm…

低代码平台推荐:五大低代码厂商谁的模式更“合适”

随着数字化时代的到来&#xff0c;低代码开发平台作为提高数字生产力的工具正受到越来越多企业的关注&#xff0c;市面上的低代码产品和厂商更是“乱花渐欲迷人眼”。 各家产品不仅功能各有不同&#xff0c;甚至商机都有区别的情况&#xff0c;如何做好产品选型已然成了采购企…

2023年国内好用的企业网盘推荐

2023年企业网盘俨然已经成为了各个企业团队的标配了&#xff0c;那么2023年国内有什么好用的企业网盘吗&#xff1f;2023国内哪个企业网盘好用&#xff1f; 国内哪个企业网盘好用&#xff1f; 由于不同行业企业对于企业网盘的具体需求点不同&#xff0c;因此我们无法从功能上评…

idea 2023 安装配置 Gradle8.4

官网&#xff1a;https://gradle.org 下载 Gradle8.4 https://gradle.org/releases/ 解压到本地&#xff0c;到 gradle-8.4\init.d 目录下新建文件&#xff1a;init.gradle 这里有个坑&#xff0c;编译报http协议安全的问题&#xff0c;解决办法&#xff0c;加入&#xff1…

【EI会议征稿】第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024)

JPCS独立出版/高录用快检索/院士杰青云集 第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024) 2024 11th International Conference on Advanced Manufacturing Technology and Materials Engineering 第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024) 定于…

前端处理返回数据为数组对象且对象嵌套数组并重名的数据,合并名称并叠加数据

前端处理返回数据为数组对象且对象嵌套数组并重名的数据&#xff0c;合并名称并叠加数据 var newList[]; var table{}; var dataObj{}; var finalList[]; var tableData[{brName:营业部,dateStr:2023-11-23,tacheArr:[{dealCnt:20,tacheName:奔驰}]},{brName:营业部,dateStr:2…

软件开发团队如何确保团队成员与项目进度一致?

在软件开发团队中&#xff0c;确保团队成员的利益与项目进度保持一致&#xff0c;可以采取以下措施&#xff1a; 建立基础流程&#xff1a;建立几个最主要的流程&#xff0c;如任务跟踪、开发效率提升、任务完成等&#xff0c;可以帮助小团队从无序逐步进入有序。 关注员工反馈…

【逆向】NahamCon CTF -Click Me Writeup(BridaFrida Hook 拿Flag)

文章目录 前言一、样式与功能点二、反编译三、Frida Get Flag四、BurpSuite插件-Brida总结 前言 第一次做外国CTF比赛的mobile challenge 题&#xff0c;题目就是一个安卓的apk安装包。顺便记录一下代码分析过程以及分享两种不同的解题思路。 提示&#xff1a;以下是本篇文章正…

选对软件公司,助力小程序商城腾飞

选择一家合适的软件公司对于小程序商城的开发和运营至关重要。在众多的软件公司中&#xff0c;如何找到最适合自己的合作伙伴呢&#xff1f;本文将从实际需求、公司实力、案例展示、服务态度和价格等五个方面&#xff0c;为您解析如何选择合适的软件公司。 一、明确实际需求 在…

用「超舒适」突围,星纪元 ES 加量不加价

在 2023 广州车展上&#xff0c;星途星纪元 ES 正式开启预售&#xff0c;新车预售区间 24.8-35.8 万元&#xff0c;共推出五款车型配置。 外观方面&#xff0c;星纪元 ES 前脸采用了封闭式的设计&#xff0c;前大灯组采用了流行的贯穿式设计搭配矩阵大灯&#xff0c;使得整个灯…

cefsharp119.4.30(cef119.4.3Chromium119.0.6045.159)版本升级体验支持x86_h264及其他多个h264版本

Cefsharp119.4.30,cef119.4.3,Chromium119.0.6045.159 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明:此版本119.4.3支持x86_H264视频播放(需要联系我),其他版本。.NETFramework 4.6.2 NuGet Gallery | CefSharp.WinForms …

Selenium(12):层级定位_通过父元素找到子元素

层级定位 在实际的项目测试中&#xff0c;经常会遇到无法直接定位到需要选取的元素&#xff0c;但是其父元素比较容易定位&#xff0c;通过定位父元素再遍历其子元素选择需要的目标元素&#xff0c;或者需要定位某个元素下所有的子元素。 层级定位的思想是先定位父对象&#xf…