springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录

环境:

1.驼峰转下划线配置 

1.1单个字段命名转化使用@JsonProperty注解

1.2单个类进行命名转化

3.全局命名策略配置

2. 序列化以及反序列化

2.1序列化

2.2反序列化

3.自定义序列化与反序列化 


在Web开发中,JSON(JavaScript Object Notation)成为了一种广泛使用的前后端、服务端与服务端的交互的数据格式,主要用于前后端数据传输和存储。

1.Java是一种面向对象编程语言,而JSON是一种键值对格式的数据,因此在Java中,需要将Java对象转换为JSON字符串,或者将JSON字符串转换为Java对象。这个过程就是JSON的序列化和反序列化。

2.在生产过程中由于命名规范的问题,前后端交互往往使用的是下划线的方式进行出入参,而java项目中的实体类中的参数命名规则一般是小驼峰命名,所以在前后端交互过程中需要进行下划线转驼峰的配置。

对于Java中的JSON序列化和反序列化,有很多开源库可供选择,其中Jackson库是最受欢迎的之一。Jackson库提供了丰富的功能,可以实现灵活的JSON序列化和反序列化,而且性能非常出色。

环境:

jdk:1.8

springboot版本:2.7.15

spingboot依赖中已经集成了Jackson相关依赖

1.驼峰转下划线配置 

jackson对驼峰转下划线配置有3个作用域的配置,分别是单个字段,单个类以及全局配置。

1.1单个字段命名转化使用@JsonProperty注解

首先我们创建一个UInfo实体类

package com.iterge.iterge_pre.entity;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;/*** @author liuph* @date 2023/9/22 11:07:12*/
@Data
public class UInfo {@JsonProperty("first_name")private String firstName;private String lastName;private Integer age;
}

接口返回测试:

package com.iterge.iterge_pre.controller;import com.iterge.iterge_pre.entity.TUser;
import com.iterge.iterge_pre.entity.UInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** <p>*  前端控制器* </p>** @author iterge* @since 2023-09-05*/
@RestController
@RequestMapping("/tUser")public class TUserController {@GetMapping("test")public UInfo get(){UInfo uInfo = new UInfo();uInfo.setFirstName("san");uInfo.setLastName("zhang");uInfo.setAge(20);return uInfo;}
}

结果:

1.2单个类进行命名转化

使用@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)注解

修改UInfo类:

package com.iterge.iterge_pre.entity;import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;/*** @author liuph* @date 2023/9/22 11:07:12*/
@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UInfo {//@JsonProperty("first_name")private String firstName;private String lastName;private Integer age;
}
package com.iterge.iterge_pre.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;/*** <p>* * </p>** @author iterge* @since 2023-09-05*/
@TableName("user_info")
public class UserInfo implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Long id;private String firstName;private String age;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"id = " + id +", firstName = " + firstName +", age = " + age +"}";}
}

接口测试结果:

上面两图可以观察到UInfo输出是下划线,而UserInfo还是驼峰。

3.全局命名策略配置

全局命名策略配置5种,需要在yml文件中设置spring.jackson.property-naming-strategy: SNAKE_CASE

命名策略描述
策略例子备注
LOWER_CAMEL_CASEfirstName默认策略 小驼峰命名
UPPER_CAMEL_CASEFirstName大驼峰命名
KEBAB_CASEfirst-name短横线命名
LOWER_CASEfirstname全小写命名
SNAKE_CASEfirst_name下划线命名

配置:

spring:profiles:active: devjackson:property-naming-strategy: SNAKE_CASE
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#mapper-locations: classpath:mapper/*Mapper.xml

修改UInfo类,注释@JsonNaming:

package com.iterge.iterge_pre.entity;import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;/*** @author liuph* @date 2023/9/22 11:07:12*/
@Data
//@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UInfo {//@JsonProperty("first_name")private String firstName;private String lastName;private Integer age;
}

测试结果:

由图可知两个接口输出都改成了“_”下划线的格式输出

2. 序列化以及反序列化

2.1序列化

将Java对象转换为JSON字符串最基本的方法就是使用​​ObjectMapper​​​类的​​writeValueAsString​​方法。这个方法接收一个Java对象作为参数,返回一个JSON字符串。

序列化和反序列化也可以使用阿里开源的fastjson,使用教程:fastjson详解

package com.iterge.iterge_pre.mapper;import com.fasterxml.jackson.databind.ObjectMapper;
import com.iterge.iterge_pre.entity.UInfo;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;/*** @author liuph* @date 2023/9/22 11:09:15*/
@SpringBootTest
public class JacksonTest {ObjectMapper mapper = new ObjectMapper();@SneakyThrows@Testpublic void test1(){UInfo uInfo = new UInfo();uInfo.setFirstName("san");uInfo.setLastName("zhang");uInfo.setAge(20);System.out.println(mapper.writeValueAsString(uInfo));}
}

2.2反序列化

将JSON字符串转换为Java对象的基本方法是使用​​ObjectMapper​​​类的​​readValue​​方法。这个方法接收两个参数:一个JSON字符串和一个Java类,它会将JSON字符串反序列化为指定的Java类对象。 

package com.iterge.iterge_pre.mapper;import com.fasterxml.jackson.databind.ObjectMapper;
import com.iterge.iterge_pre.entity.UInfo;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;/*** @author liuph* @date 2023/9/22 11:09:15*/
@SpringBootTest
@Slf4j
public class JacksonTest {ObjectMapper mapper = new ObjectMapper();@SneakyThrows@Testpublic void test1(){UInfo uInfo = new UInfo();uInfo.setFirstName("san");uInfo.setLastName("zhang");uInfo.setAge(20);System.out.println(mapper.writeValueAsString(uInfo));}@SneakyThrows@Testpublic void test2(){String str = "{\"firstName\":\"san\",\"lastName\":\"zhang\",\"age\":20}";UInfo uInfo = mapper.readValue(str, UInfo.class);log.info("first name:{}",uInfo.getFirstName());}
}

3.自定义序列化与反序列化 

在某些情况下,Jackson库提供的默认序列化和反序列化行为可能无法满足需求,需要自定义序列化和反序列化规则。例如,在序列化​​UInfo对象时,我们希望将年龄按字符串类型序列化,而不是默认的整型类型。

 新建序列化方法IntToStringSerializer

package com.iterge.iterge_pre.config;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;/*** @author liuph* @date 2023/9/22 14:17:07*/public class IntToStringSerializer extends JsonSerializer<Integer> {@Overridepublic void serialize(Integer integer, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(integer.toString());}
}

对UInfo对象age字段添加注解@JsonSerialize(using = IntToStringSerializer.class)

package com.iterge.iterge_pre.entity;import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.iterge.iterge_pre.config.IntToStringSerializer;
import lombok.Data;/*** @author liuph* @date 2023/9/22 11:07:12*/
@Data
//@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UInfo {//@JsonProperty("first_name")private String firstName;private String lastName;@JsonSerialize(using = IntToStringSerializer.class)private Integer age;
}

测试:

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

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

相关文章

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

数据结构题型10-链栈

//参考博客&#xff1a;https://blog.csdn.net/weixin_37716512/article/details/104068102 #include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct Linknode {Elemtype data;…

DS18B20温度传感器

DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器 这种一线总线就是 三线制 SPI DS18B20的 配置寄存器&#xff1a; TM 是测试位&#xff0c;出厂设置就被设置为0&#xff0c;不需要改动&#xff0c; R1、R…

企业架构LNMP学习笔记61

Nginx作为tomcat的前段反向代理&#xff1a; 在实际业务环境中&#xff0c;用户是直接通过域名访问&#xff0c;基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端的tomcat的方式&#xff0c;来实现用户可以通过域名访问tomcat的we…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家&#xff0c;我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司&#xff0c;但了解到的收款手续费率通常都在0.6左右&#xff0c;最低也只能降到0.38。这个过程吃过不少苦头。毕竟&#xff0c;收款功能是我们商家的命脉&…

AI聊天ChatGPT系统源码卡密验证开源版

ChatGPT卡密验证版源码是一个基于PHP7.4和MySQL5.6的聊天AI源码&#xff0c;它不仅支持暗黑模式、反应速度极快&#xff0c;而且充值方面采用后台生成卡密方式&#xff0c;方便快捷&#xff0c;如果您有能力将其接入在线支付&#xff0c;即可进一步拓展充值方式&#xff0c;为更…

KMeans算法全面解析与应用案例

目录 一、聚类与KMeans介绍聚类的基础概念KMeans算法的重要性 二、KMeans算法原理数据集和特征空间距离度量算法步骤 三、KMeans案例实战案例背景&#xff1a;客户细分数据集说明Python实现代码输出与解释 四、KMeans的优缺点优点计算效率高算法简单易于实现 缺点需要预设K值对…

一、机器学习基础知识:基本概念与Python开发环境

文章目录 1、机器学习的不同类型1.1 监督学习1.2 无监督学习1.3 强化学习 2、Python开发环境2.1 Python第三方库2.2 AnacondaPycharm集成开发环境 1、机器学习的不同类型 机器学习属于人工智能的一个分支&#xff0c;专门用于对数据进行自动分析以发现相关规律&#xff0c;从而…

视频监控/视频汇聚/安防视频监控平台EasyCVR配置集群后有一台显示离线是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

芯片验证就是一次旅行

如果你国庆希望去一个你不曾去过的城市旅行&#xff0c;比如“中国苏州”。对游客来说&#xff0c;它是个蛮大的城市&#xff0c;有许多景点可以游玩&#xff0c;还有许多事情可以做。但实际上&#xff0c;即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…

肖sir__mysql中数据库后端无法展示

mysql中数据库后端无法展示&#xff1a; 错误现象 解决方法&#xff1a; mysql中数据库后端无法展示&#xff1a;my.cnf (5,7数据库) 在 mysql 配置文件中加入&#xff1a; sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 或者重启数据库

Android Kotlin 基础详解

1,基础语法 1.1 可变变量与不可变变量 可以多次赋值的变量是可变变量&#xff0c;用关键字var表示&#xff1a; var <标识符> : <类型> <初始化值> 注意&#xff0c;在kotlin中成员变量不会赋默认值&#xff0c;不像java一样&#xff0c;必须手动添加默…

Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl总结(一百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

「大数据-2.1」HDFS集群启停命令

目录 一、HDFS集群一键启停脚本 1. HDFS集群的一键启动脚本 2. HDFS集群的一键关闭脚本 二、单进程启停 1. hadoop-daemon.sh脚本 2. hdfs脚本 三、总结 1. 一键启停脚本 2. 独立进程启停 一、HDFS集群一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 1. HDFS集群…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy&#xff08;5.15&#xff09; ros2版本: humble 安装参考&#xff1a; Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可&#xff0c;到安装软件包的时候&#xff0c;若只为开发&#xff0…

【LeetCode热题100】--56.合并区间

56.合并区间 排序&#xff1a; 如果按照区间的左端点排序&#xff0c;那么在排完序的列表中&#xff0c;可以合并的区间一定是连续的&#xff0c;如下图所示&#xff0c;标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间&#xff0c;它们在排完序的列表中是连续的 算法&a…

安科瑞AMC16-DETT铁塔jizhan直流电能计量模块,直流计量用

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 9月20日&#xff0c;在杭州亚运会火炬传递的现场&#xff0c;不少人通过网络与亲友连线&#xff0c;共同见证火炬传递的历史时刻。上午6时&#xff0c;杭州铁塔的一线通信保障人员共27人就已经在本次火炬传递收官点位奥体中心西广场附近&a…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序&#xff1a; ① 当前运行的进程&#xff1a;陷阱程序&#xff08;系统调用&#xff09; 和 故障程序&#xff08;page fault&#xff09; &#xff0c;进程运行在内核态的时候&#xff0c;其实就是在执行进程在用户态触发的…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#xff0c;板载…