详细介绍Spring Boot中用到的JSON序列化技术?

前言

在SpringBoot提供了很多的JSON数据处理方式,其中最主要的也是默认的就是通过Jackson 库进行序列化和反序列化,下面我们就来详细的介绍一下SpringBoot中关于JSON数据处理相关的内容。

Jackson 库

在SpringBoot中默认就集成了Jackson库,就是用这个库来对Java对象进行序列化和反序列化的操作,如下所示。

ini 复制代码
import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();

// Java 对象转 JSON 字符串
String jsonString = objectMapper.writeValueAsString(myObject);

// JSON 字符串转 Java 对象
MyObject myObject = objectMapper.readValue(jsonString, MyObject.class);

所谓的序列化,就是指将Java对象转换成JSON数据的过程,而反序列化则是将JSON数据转换成Java对象的过程。

在SpringBoot中 @RestController 和 @RequestBody等注解都是通过Jackson库来进行序列化、反序列化的操作。如下所示

使用 @RestController 和 @RequestBody

我们可以在Controller上标注上面的两个注解,就会看到通过请求响应的参数都会以JSON格式的数据进行传输。

kotlin 复制代码
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class MyController {

    @PostMapping("/create")
    public MyObject create(@RequestBody MyObject myObject) {
        // 处理请求的 JSON 数据
        return myObject;
    }

    @GetMapping("/get")
    public MyObject get() {
        // 返回 JSON 数据
        return new MyObject("example", 123);
    }
}

如下所示,就是通过上面的两个注解进行的序列化操作之后的内容。

JSON View

通过JaskSon提供的 @JsonView注解,我们也可以根据具体的视图来控制需要我进行JSON序列化输出的字段。如下所示。

kotlin 复制代码
mport com.fasterxml.jackson.annotation.JsonView;

public class MyObject {

    public interface View {
        interface Summary {}
        interface Details extends Summary {}
    }

    @JsonView(View.Summary.class)
    private String name;

    @JsonView(View.Details.class)
    private int value;

    // getters and setters
}

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/summary")
    @JsonView(MyObject.View.Summary.class)
    public MyObject getSummary() {
        return new MyObject("example", 123);
    }

    @GetMapping("/details")
    @JsonView(MyObject.View.Details.class)
    public MyObject getDetails() {
        return new MyObject("example", 123);
    }
}

在上面的实现中,通过@JsonView注解来指定所要进行序列化输出的字段。

当然了除了利用默认的序列化、反序列化的情况之外,我们还可以通过自定义的方式来实现序列化反序列化的操作。如下所示。

自定义序列化和反序列化

通过自定义序列化和反序列化器来控制 JSON 数据的处理方式,如下所示,我们可以自定义一个序列化反序列化的处理器。

自定义序列化器

scala 复制代码
public class MyObjectSerializer extends StdSerializer<MyObject> {

    public MyObjectSerializer() {
        this(null);
    }

    public MyObjectSerializer(Class<MyObject> t) {
        super(t);
    }

    @Override
    public void serialize(MyObject myObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
            throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", myObject.getName());
        jsonGenerator.writeNumberField("value", myObject.getValue());
        jsonGenerator.writeEndObject();
    }
}

自定义反序列化的处理器

scala 复制代码
mport com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class MyObjectDeserializer extends JsonDeserializer<MyObject> {

    @Override
    public MyObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
            throws IOException {
        // 自定义反序列化逻辑
        return new MyObject("custom", 456);
    }
}

接下来就是看看如何使用这个序列化反序列化的工具。我们可以将自定义的序列化,反序列化的处理器注入到容器中。

arduino 复制代码
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public SimpleModule customModule() {
        SimpleModule module = new SimpleModule();
        module.addSerializer(MyObject.class, new MyObjectSerializer());
        module.addDeserializer(MyObject.class, new MyObjectDeserializer());
        return module;
    }
}

这样我们就可以使用自定义的序列化、反序列化工具来对数据进行处理了。在SpringBoot中提供了很多JSON数据的处理能力,我们可以通过这些处理方式来处理各种场景下的JSON数据,包括但不限于对于Redis缓存数据的处理、Session信息的处理等等。

相关推荐
消失的旧时光-19435 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
NE_STOP6 小时前
Redis--发布订阅命令和Redis事务
java
PAC_3Dame6 小时前
记一次真实的线上OOM
java
SunnyDays10116 小时前
如何在Java中将Word文档转换为图像(JPEG、PNG或SVG)
java
追风筝的人er6 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
Lumos_7776 小时前
Linux -- 线程
java·jvm·算法
知兀7 小时前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV7 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子7 小时前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路7 小时前
C++20概述
java·开发语言·c++20