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

news2024/12/23 19:15:59

目录

环境:

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

测试:

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

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

相关文章

ImageJ查看图像灰度值矩阵及像素编号从0开始

ImageJ查看图像灰度值矩阵 imagej打开一幅图像 然后image —— transform——image to results&#xff0c;等一下就会出现灰度值矩阵 我读取的如下&#xff0c;可以看出&#xff0c;imagej对像素的编号是从0开始的&#xff0c;切记&#xff01;&#xff01;&#xff01;跟C/…

【论文笔记】Scene as Occupancy

原文链接&#xff1a;https://arxiv.org/abs/2306.02851 1. 引言 与传统的3D框物体表达相比&#xff0c;使用3D占用表达是几何感知的&#xff0c;因为3D框表达简化了物体的形状。此外&#xff0c;现有基于视觉的方法很少考虑时间信息&#xff1b;单阶段方法缺少从粗到细的细化…

Linux 线程(thread)

进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能&#xff1a;创建一个子线程&#xff0c;一般情况下main函数所在的线程称为主线程&#xff0c;…

科技资讯|Canalys发布全球可穿戴腕带设备报告,智能可穿戴增长将持续

市场调查机构 Canalys 近日发布报告&#xff0c;表示 2023 年第 2 季度全球可穿戴腕带设备出货量达 4400 万台&#xff0c;同比增长了 6%。 主要归功于其亲民的价格以及消费者对价位较高的替代品仍持谨慎态度&#xff0c;基础手环市场尽管与去年同期相比有所下降&#xff0c;…

JDBC连接mysql

文章目录 JDBC简介JDBC-MYSQL驱动下载JDBC使用通过结果集查询 PreparedStatement 预处理查询事务批处理连接池1.C3P02.德鲁伊 druid DBUtils工具 JDBC简介 JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI&#xff0c;可以为多种关系数据库提供统…

极简式看图软件 Pixea Plus for Mac

Pixea Plus for Mac介绍 简单易用&#xff1a;Pixea的用户界面非常简洁直观&#xff0c;容易上手。 图片管理&#xff1a;Pixea允许用户创建个人或业务相册&#xff0c;并提供了图片搜索、排序、过滤等多种管理功能&#xff0c;方便用户组织和查找照片。 图片编辑&#xff1…

【Java 基础篇】Java网络编程:文件下载详解

文件下载是网络应用程序中的一个常见任务&#xff0c;允许用户从远程服务器获取文件。Java提供了丰富的网络编程库&#xff0c;使文件下载变得相对简单。本文将详细介绍如何使用Java进行文件下载&#xff0c;并提供一些相关内容的解释。 什么是文件下载 文件下载是指从一个网…

Django之初入门

一&#xff09;Django简介 1.简介 Django是一个开源的Python Web框架&#xff0c;它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC&#xff08;Model-View-Controller&#xff09;的架构模式&#xff0c;通过强大的工具和功能&#xff0c;提供了一套完整…

最新版本 在线生成SSL证书源码 后台对接ssl证书api接口

SSL证书是保证网络安全的基本保障之一。向您介绍我们的在线生成SSL证书系统&#xff0c; 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;后台对接ssl证书api接口。

金融行业如何利用软文营销进行品牌维护

金融行业作为强监管行业&#xff0c;与人民财产息息相关&#xff0c;因此塑造可靠的品牌形象是金融行业必须面对的课题&#xff0c;而金融行业的特性决定了它在品牌传播与建设上会受到一定的限制&#xff0c;因此金融行业想要进行品牌维护的话&#xff0c;软文营销就是非常不错…

频频刷屏朋友圈,白酒如何越来越年轻化?来聊聊白酒企业数字化

最近&#xff0c;某白酒品牌频频吸引大众眼球&#xff0c;白酒与咖啡、巧克力等联名衍生品一经推出便掀起热潮。某商品由于太过火爆&#xff0c;甚至一度售罄下架。 不得不说&#xff0c;我国拥有超大规模内需市场&#xff0c;消费潜力巨大。 当前&#xff0c;创新消费场景加…

vue 路由中 vite 与webpack 动态 导入的方法汇总

vite 动态导入路由&#xff1a; router/index.js文件 //vite 下面寻找 views 文件夹下面所有的page.js文件 let pageList import.meta.glob(../views/**/page.json, {eager: true,import: default, }); //所有的文件 const modules import.meta.glob(../views/**/**.vue);/…

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选 适用性较广的基础多选&#xff0c;用 Tag 展示已选项 <template><el-select v-model"value1" multiple placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.la…

linux下特定usb设备的权限设置

文章目录 背景查找资料解决方案 背景 目前我在Ubuntu下使用一个USB热成像摄像头&#xff0c;通过调用它的sdk进行图像的采集以及获取对应像素点的温度。假设我现在的测试程序名称为MyApp。 当我用下面的命令运行时&#xff0c;程序是正常运行且能从热成像仪采集图像 sudo ./M…

上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案

自米尔国产全志T113系列的核心板发布以来&#xff0c;这款高性价比、低成本、入门级、高性能的国产核心板咨询不断&#xff0c;配套的开发板已经成交量数百套&#xff0c;深受工程师们的青睐&#xff0c;为了集齐T113全系列的产品&#xff0c;这次米尔发布了基于全志T113-i处理…

Spring学习笔记2 Spring的入门程序

Spring学习笔记1 启示录_biubiubiu0706的博客-CSDN博客 Spring官网地址:https://spring.io 进入github往下拉 用maven引入spring-context依赖 写spring的第一个程序 引入下面依赖,好比引入Spring的基本依赖 <dependency><groupId>org.springframework</groupId&…

DA5 网站用户没有补全的信息

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID …

应用在苹果应用商店该如何进行优化

众所周知&#xff0c;ASO最大化的提高应用程序在商店中的可见性&#xff0c;其目标是获得更多的下载量&#xff0c;同时它也与下载的转化率有关。 1、根据应用阶段追求不同的目标。 它可以是有机增长或转化率的提高&#xff0c;获得更多安装并降低用户获取成本&#xff0c;增加…

【Node.js】定时任务cron:

文章目录 一、文档&#xff1a;【Nodejs 插件】 二、安装与使用【1】安装【2】使用 三、cron表达式&#xff1a;{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}四、案例&#xff1a; 一、文档&#xff1a; 【说明文档】https://www.npmjs.com/package/cron 【Cron表…

Python 打印所有水仙花数

"""打印三位水仙花数介绍&#xff1a;水仙花数是指一个 n 位数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个三位的水仙花数&#xff0c;因为 (1**3) (5**3) (3**3) 153。下面是一个 Python 程序&#xff0c;用于生成…