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

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

测试:

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Boot开发中,我们经常需要将JSON对象换为Java对象或反之亦然。但是,在JSON和Java对象之间换的过程中,往往会遇到下划线驼峰命名风格的差异问题。这个时候,我们可以使用Spring Boot自带的Jackson库进行换。下面我将详细介绍如何在Spring Boot中使用Jackson库进行下划线驼峰格式的换。 1. 下划线换成驼峰Spring Boot中,使用Jackson库进行下划线驼峰命名格式的换,需要在配置文件中进行配置,首先我们需要在application.yaml配置文件中添加以下内容: ```yaml # 进行下划线驼峰 spring: jackson: property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategy$SnakeCaseStrategy ``` 添加这段配置代码后,就可以实现下划线驼峰。在进行Java对象与JSON字符串之间的换时,JSON字符串的下划线将会自动换为Java对象驼峰命名格式,例如,原本`user_name`的JSON字段在Java对象中将会变成`userName`。 2. 驼峰换成下划线 在进行Java对象与JSON字符串之间的换时,我们也可以将Java对象中的驼峰命名格式换为JSON字符串中的下划线。要实现这个功能,我们需要在配置文件中加入以下代码: ```yaml # 进行驼峰下划线 spring: jackson: property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategy$SNAKE_CASE ``` 这时候,在进行Java对象与JSON字符串之间的换时,Java对象中的驼峰命名格式就会被自动换成JSON字符串中的下划线格式,例如,Java对象中的`userName`字段会自动被换成JSON字符串中的`user_name`。 总结: 在Spring Boot中,使用Jackson库进行下划线驼峰命名格式的换,只需要在application.yaml配置文件中添加一段内容即可。设置`com.fasterxml.jackson.databind.PropertyNamingStrategy$SnakeCaseStrategy`可以将下划线换成Java对象驼峰命名格式,而将`com.fasterxml.jackson.databind.PropertyNamingStrategy$SNAKE_CASE`设置为属性命名策略,则可以将Java对象中的驼峰命名格式自动换成JSON字符串中的下划线格式。这样的配置可以很方便地适应不同的数据接口和Java对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空、大师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值