详细介绍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信息的处理等等。

相关推荐
郑州光合科技余经理1 小时前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
章豪Mrrey nical7 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
超级大只老咪8 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶8 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长8 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子8 小时前
JDK 安装配置
java·开发语言
星哥说事8 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink9 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼9 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII9 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端