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

相关推荐
落枫5935 分钟前
OncePerRequestFilter
后端
课程xingkeit与top35 分钟前
大数据硬核技能进阶:Spark3实战智能物业运营系统(完结)
后端
课程xingkeit与top36 分钟前
基于C++从0到1手写Linux高性能网络编程框架(超清)
后端
语落心生36 分钟前
探秘新一代向量存储格式Lance-format (二十二) 表达式与投影
后端
雨中飘荡的记忆36 分钟前
MySQL 优化实战
java·mysql
豆豆的java之旅38 分钟前
深入浅出Activity工作流:从理论到实践,让业务流转自动化
java·运维·自动化·activity·工作流
码事漫谈39 分钟前
音域之舞-基于Rokid CXR-M SDK的AI眼镜沉浸式K歌评分系统开发全解析
后端
一点 内容1 小时前
深度解析OurBMC后端模式:全栈技术架构与运维实践
java·开发语言
q***23571 小时前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql