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

2023-09-22 14:36:49

目录

环境:

1.驼峰转下划线配置 

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

1.2单个类进行命名转化使用@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)注解

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;
    }

    @Override
    public 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: dev
  jackson:
    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
    @Test
    public 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
    @Test
    public void test1(){
        UInfo uInfo = new UInfo();
        uInfo.setFirstName("san");
        uInfo.setLastName("zhang");
        uInfo.setAge(20);
        System.out.println(mapper.writeValueAsString(uInfo));
    }

    @SneakyThrows
    @Test
    public 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> {
    @Override
    public 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;
}

测试:

更多推荐

个人电脑(windows、mac)安装Docker Desktop

目录什么是Docker?DockerDesktop在个人电脑上的作用安装DockerDesktop在学习大数据、人工智能等技术时,常常需要安装相应软件来支持我们的学习和实践。然而,很多这样的软件更适合在Linux环境下进行部署和运行。通过在个人电脑安装DockerDesktop可以解决该类问题,在个人电脑上轻松地搭建软

[hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用

参考:Apachehive3.1.2从单机到高可用部署HiveServer2高可用Metastore高可用hiveonsparkhiveserver2webUI高可用集群启动脚本_薛定谔的猫不吃猫粮的博客-CSDN博客没用里头的hiveonspark,测试后发现版本冲突一、Hive集群规划(蓝色部分)ck1ck2ck3

SpringCloud OpenFeign--声明式WebService 客户端

😀前言本篇博文是关于SpringCloudOpenFeign的基本介绍,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进的地方还请大佬不吝

2023华为OD统一考试(B卷)题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢?一、逻辑分析二、数据结构1、线性表①数组②双指针2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈三、算法1、基础算法①贪心算法②二分查找③分治递归④搜索算法⑤排序算法2、字符串①KMP②字符串处理③正则表达式3、深度优先搜索①广

携手共赴数智未来|维视智造出席2023英特尔工业物联网大会

​​9月20日,“数智芯生力”2023英特尔工业物联网大会”于上海隆重举办。作为主办方,英特尔邀请了赋能工业数字化技术创新的多位合作伙伴,展示当前中国工业物联网领域的优秀技术与成果,共聚一堂积极探讨数字化机器视觉、控制机器人等领域的热点话题。在工业数字化转型和“双碳”目标驱动下,制造业众多领域正在以前所未有的速度步入工

大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。面对大型集团全球化的管理诉求,数字化办公系统作为集团日常使用的平台,自然需要适应企业管理升级,灵活适应国际化带来的管理发展变化和满足全球协同办公需求。最重要的是实现信

华为OD:跳房子I

题目描述跳房子,也叫跳飞机,是一种世界性的儿童游戏。游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格跳房子的过程中,可以向前跳,也可以向后跳。假设房子的总格数是count,小红每回合可能连续跳的步教都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?如果有,请输出索引和最小

ffmpeg抠图

1.不用png,用AVFrame2.合流3.图片抠图透明(1.)mp4扣yuv图,(2)用1.把一张yuv标记为透明然后av_hwframe_transfer_data到GPU(3)用抠图算法函数对yuv进行处理(4)qsv的h264_qsv只支持nv12和qsv,但qsv本身并不限制像素格式,比如在qsv里可以用vp

MES系统是如何采集Modbus设备数据的呢?

随着工业自动化的不断发展,各种协议和标准在行业中变得越来越重要。其中,Modbus协议是一种在工业自动化领域非常流行的通信协议,而Modbus网关是实现Modbus协议转换的关键设备。一、MES系统与Modbus网关MES系统即制造执行系统(ManufacturingExecutionSystem),是一套面向制造过程

【含java面试题】深入解析栈溢出及JVM参数设置

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

SQL性能优化

当你的数据里只有几千几万,那么SQL优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让MySQL查询语句又快又好是一件很重要的事情。要让SQL又快又好的前提是,我们知道它「病」在哪里,而explain关键字就是MySQL提供给我们的一把武器!在我们

热文推荐