SpringBoot注解--11--@JSONField @JsonProperty

news2024/9/23 13:27:08

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一个问题:后端实体类isXXX开头的属性,传到前端后自动去掉is
    • 解决方法:
  • @JsonProperty和@JSONField
    • 1.简介
    • 2.注解的区别
      • 2.1 底层框架不同
      • 2.2 作用域不同
      • 2.3 优劣对比
  • @JsonProperty
        • 如果使用的是新建的==springboot项目==,默认就是Jackson序列化,直接在属性上使用注解即可。
    • 1.依赖
    • 2.测试json字符串与bean对象相互转换
  • @JSONField
    • 1.依赖
    • 2.测试json字符串与bean对象相互转换
    • 3.format属性
    • 4. serialize属性
    • 5.deserialize属性
    • 6.ordinal属性
    • 7.defaultValue属性
    • 8. type属性


一个问题:后端实体类isXXX开头的属性,传到前端后自动去掉is

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方法:

  1. 将生成的isReceipt()方法名改成getIsReceipt()
  2. 在生成的get方法上面也就是isReceipt上面加上@JsonProperty(value = “isXXX”)注解
 @JsonProperty(value = "isReceipt")
    public boolean isReceipt() {
        return isReceipt;
    }
    @JsonProperty(value = "isExamine")
    public boolean isExamine() {
        return isExamine;
    }

在这里插入图片描述

@JsonProperty和@JSONField

1.简介

  • @JsonProperty和@JSONField注解都是为了解决obj转json字符串的时候,将java bean的属性名替换成目标属性名。常见于调用第三方接口的时候属性名不一致的场景。
  • 两个注解的作用是相同的,只是来源不同,使用方式不同。下面将详解其异同!

2.注解的区别

2.1 底层框架不同

  • @JsonProperty 是Jackson实现的
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • @JSONField 是fastjson实现的
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

2.2 作用域不同

@JSONproperty 注解用于属性上面

  • 如把trueName属性序列化为name,可以在属性名上面增加@JsonProperty(value=“name”)。

@JSONField 注解可以用于get、set 以及 属性上面

  • 如把trueName属性序列化为name,可以在get/set/属性名上面增加@JSONField(value=“name”)。

2.3 优劣对比

  1. @JSONField注解的使用方式更加简单,注解默认的值与属性名相同,而@JsonProperty需要手动指定属性名

  2. @JSONField注解支持更多的属性映射选项,例如序列化时的日期格式,空值的处理方式等

  3. @JSONField注解的性能较快,因为fastjson本身就是一款高性能的JSON处理库

  4. 在使用Jackson框架时,只能使用@JsonProperty注解,无法使用@JSONField注解

@JsonProperty

如果使用的是新建的springboot项目,默认就是Jackson序列化,直接在属性上使用注解即可。

1.依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • @JsonProperty注解来源于jackson包,搭配ObjectMapper().writeValueAsString(实体类)方法使用,将实体类转换成json字符串。
  • 搭配ObjectMapper().readValue(字符串)方法使用,将json字符串转换成实体类。

2.测试json字符串与bean对象相互转换

实体类:User.java

import com.fasterxml.jackson.annotation.JsonProperty;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JsonProperty("JsonPropertyName")
	private String name;
	private String sex;
	private Integer age;
}

测试方法:

@Test
public void testJsonProperty() throws IOException{
    //bean ---> json
	User user=new User("zhangsan","man",22);
	
	System.out.println(new ObjectMapper().writeValueAsString(user));
	

    //json ---> bean
	String str="{\"sex\":\"man\",\"age\":22,\"JsonPropertyName\":\"zhangsan\"}";
	
	System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}

测试结果:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 可见,bean转成json字符串后,@JsonProperty注解的bean属性名已经替换成了指定属性名:JsonPropertyName;

  • json字符串转成bean后,@JsonProperty注解指定的属性名已经替换成了bean属性名:name;

@JSONField

1.依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • @JSONField是位于fastjson包里面,搭配JSON.toJSONString(实体类)方法使用,将实体类转换成json字符串。
  • 搭配JSON.parseObject(字符串,实体类.class)方法使用,将json字符串转换成实体类。

2.测试json字符串与bean对象相互转换

实体类:User.java

import com.alibaba.fastjson.annotation.JSONField;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JSONField(name="JSONFieldName")
	private String name;
	private String sex;
	private Integer age;
}

测试方法:

@Test
public void testSONField(){
    //bean ---> json
	User user=new User("zhangsan","man",22);
	System.out.println(JSON.toJSONString(user));
	
    //json ---> bean
	String str="{\"JSONFieldName\":\"zhangsan\",\"age\":22,\"sex\":\"man\"}";
	System.out.println(JSON.parseObject(str, User.class).toString());	
}

测试结果:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  1. 可见,bean转成json字符串后,@JSONField注解的bean属性名已经替换成了指定属性名:JSONFieldName;
  2. json字符串转成bean后,@JSONField注解指定的属性名已经替换成了bean属性名:name;
  3. 测试结果同@JsonProperty。

3.format属性

通过format属性可以指定日期类型属性的格式,以及将数字类型转为字符串类型的格式

public class User {
    private String name;
    private int age;
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;
    @JSONField(format = "#,###.00")
    private double salary;
}
  • 在上面的例子中,使用@JSONField注解指定了birthday属性的日期格式为“yyyy-MM-dd”
  • salary属性的数字格式为“#,###.00”

4. serialize属性

  • 通过serialize属性可以控制属性是否序列化到JSON对象中
  • 当serialize属性为false时,属性将不会序列化到JSON对象中,默认为true
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}

在上面的例子中,使用@JSONField注解将userId属性从序列化中排除

5.deserialize属性

  • 通过deserialize属性可以控制是否将JSON对象中的属性反序列化到Java对象中
  • 当deserialize属性为false时,该属性将不会从JSON对象中反序列化到Java对象中,默认为true
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}

在上面的例子中,使用@JSONField注解将age属性从反序列化中排除

6.ordinal属性

通过ordinal属性可以指定属性的顺序

  • 默认情况下,属性的顺序是按照属性在Java对象中的顺序排列的
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的顺序为1,name属性的顺序为2

7.defaultValue属性

通过defaultValue属性可以指定属性在Java对象中的默认值

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}

在上面的例子中,使用@JSONField注解指定了userId属性的默认值为0,name属性的默认值为“N/A”

8. type属性

  • 通过type属性可以指定属性的类型
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的类型为字符串类型

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

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

相关文章

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包&#xff0c;使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

基于QT开发的反射内存小工具

前言 最近项目需要需要开发一个反射内存小工具&#xff0c;经过2天的修修改终于完成了。界面如下&#xff1a; 功能简介 反射内存指定地址数据读取反射内存指定地址数据写入反射内存指定地址数据清理十进制、十六进制、二进制数据相互转换 部分代码 void RfmMain::setWOthe…

十七、计算机视觉-图像平滑处理

提示&#xff1a;云峰 文章目录 前言一、均值滤波&#xff08;Mean Filtering&#xff09;二、高斯滤波器&#xff08;Gaussian Filter&#xff09;&#xff1a;三、中值滤波器&#xff08;Median Filter&#xff09; 前言 在本节中&#xff0c;我们将探讨图像处理中的平滑处理…

短视频矩阵管理系统:如何提升内容质量,帮助企业获客?

在数字化营销蓬勃发展的今天&#xff0c;短视频已成为企业推广的重要阵地。然而&#xff0c;如何高效管理短视频内容&#xff0c;提升内容质量&#xff0c;进而帮助企业精准获客&#xff0c;成为企业亟待解决的问题。短视频矩阵管理系统应运而生&#xff0c;以其强大的功能和灵…

uniapp:使用mescroll实现左导航,右数据(数据带分页)

<template><view class"u-wrap"><u-navbar title"复购" :is-back"false" :border-bottom"false" title-color"#282828"></u-navbar><view class"u-menu-wrap"><scroll-view scr…

Visual Studio下安装引入Boost库

背景&#xff1a; 在 Win 上通过 Visual Studio 运行 c 代码&#xff0c;引入头文件 #include <boost/...>&#xff0c;显式无法打开&#xff0c;需要手动下载boost并进行配置。 1、下载boost Boost官网&#xff1a;Boost Downloads 下载boost&#xff0c;解压&#xf…

2024年高职物联网实验室建设及物联网实训平台整体解决方案

随着物联网技术的蓬勃发展&#xff0c;其在各行业的应用日益广泛&#xff0c;对具备物联网专业技能的高素质人才需求也急剧增加。为了满足这一市场需求&#xff0c;高职院校作为技能型人才培养的重要阵地&#xff0c;亟需加强物联网专业的建设。本文旨在提出《2024年高职物联网…

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI&#xff1a;译作外部中断/事件控制器&#xff0c;STM32的众多片上外设之一&#xff0c;能够检测外部输入信号的边沿变化并由此产生中断。 例如&#xff0c;在检测按键时&#xff0c;按键按下时会使电平产生翻转&#xff0c;因此可以使用EXTI来读取按下时…

ChatGPT摆脱“AI味”:全面提升写作质感

ChatGPT在各种写作、创作场景都发挥了很大的价值&#xff0c;即使中文语料库占比不到5%&#xff0c;也能生成流畅的中文文本。但随着使用的深入&#xff0c;大家也逐渐发现了机器生成的内容&#xff0c;往往带有一种僵硬、刻板的“AI味”&#xff0c;尤其在论文、自媒体写作中&…

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述 RK3308H 使用8路个模拟麦克风录音&#xff0c;2路用es7243e做回采 解决方案&#xff1a; 首先先调8路模拟麦克风&#xff0c;根据原理图确定使用的是哪路I2S。 以下为dts配置&#xff0c;acodec的属性注释附上。 &acodec {status "okay";rockchip,m…

CCNA-2-V7-模块7–9:可用且可靠的网络考试答案

1.一台启用了DHCP的客户端PC刚刚启动。客户端PC在与DHCP服务器通信时,将在哪两个步骤中使用广播消息?(选两个。) DHCPDISCOVERDHCPACKDHCPOFFERDHCPREQUESTDHCPNAK 2.管理员发出命令:管理员想达到什么目的? Router(config)# interface g0/1 Router(config-if)# ip address …

智充科技营收增速放缓:经营成本飙升,应收账款大幅增长

《港湾商业观察》黄懿 6月10日&#xff0c; XCHG Limited 智能充电有限公司(下称&#xff1a;智充科技)在美国证监会(SEC)更新招股书&#xff0c;拟在美国纳斯达克上市&#xff0c;其股票代码为“XCH”。北京智充科技有限公司为其国内运营主体&#xff08;下称“北京智充科技”…

深入理解Java集合框架:构建高效、灵活的数据管理方案

深入理解Java集合框架&#xff1a;构建高效、灵活的数据管理方案 引言 Java集合框架&#xff08;Java Collections Framework, JCF&#xff09;是Java语言提供的一套用于表示和操作集合的统一架构。它包含了一系列的接口和类&#xff0c;用于存储和操作对象集合&#xff0c;如…

两个视频怎么剪辑成一个视频?3个方法分享

两个视频怎么剪辑成一个视频&#xff1f;将两个视频剪辑成一个视频&#xff0c;是现代数字内容创作中的高频需求&#xff0c;它不仅简化了素材管理&#xff0c;还能通过创意剪辑提升作品连贯性与表现力。通过精心编排&#xff0c;两个视频片段可以无缝融合&#xff0c;讲述更完…

DolphinScheduler本地安装部署与远程任务调度管理实践应用

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

MES系统与其他系统的集成:提升制造业智能化的关键路径

在当今高度竞争的制造业环境中&#xff0c;企业对于生产效率、质量控制、资源优化以及快速响应市场变化的需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接企业计划层与车间控制层的重要桥梁&#xff0c;其在提升生产透明度和优化生产流程方面发挥着不可替代的作…

DOM元素可编辑自定义样式获取编辑后的数据

内容比较多&#xff0c;好好看看&#xff0c;收获匪浅 前言&#xff1a;有这么一个场景&#xff0c;比如一个dom元素是可以编辑的&#xff0c;并且编辑样式得自己写一下&#xff0c;这时候我们考虑单独写一套div来控制编辑样式和编辑的内容。内部有很多的span节点需要渲染&…

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

Linux环境下Oracle 11g的离线安装与配置历程

在成功体验了 Windows 版本的Oracle 11g 后&#xff0c;这几天心血来潮&#xff0c;决定再挑战一下Linux 环境下的安装&#xff0c;特别是在考虑到部门内部虚拟机无法联网的情况下&#xff0c;我选择了在CentOS 7上进行离线安装。这次安装之旅&#xff0c;主要参考了下面大佬的…

异步日志:性能优化的金钥匙

一、背景 2024 年 4 月的一个宁静的夜晚&#xff0c;正当大家忙完一天的工作准备休息时&#xff0c;应急群里“咚咚咚”开始报警&#xff0c;提示我们余利宝业务的赎回接口成功率下降。 通过 Monitor 监控发现&#xff0c;该接口的耗时已经超过了网关配置的超时阈值(2s)&#…