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

相关推荐
初听于你2 分钟前
Java 泛型详解
java·开发语言·windows·java-ee
rainbow68892 分钟前
Java17新特性深度解析
java·开发语言·python
爬山算法3 分钟前
Hibernate(79)如何在ETL流程中使用Hibernate?
java·hibernate·etl
Z.风止4 分钟前
Go-learning(1)
开发语言·笔记·后端·golang
光电大美美-见合八方中国芯6 分钟前
【SOA仿真6】多层膜仿真计算
后端·restful
rainbow688910 分钟前
Java实战:5230台物联网设备时序数据处理方案
java
爬山算法10 分钟前
Hibernate(80) 如何在数据迁移中使用Hibernate?
java·oracle·hibernate
Elias不吃糖13 分钟前
Day1 项目启动记录(KnowledgeDock)
java·springboot·登陆·项目启动
belldeep13 分钟前
Java:Tomcat 9, flexmark 0.6 和 mermaid.min.js 10.9 实现 Markdown 中 Mermaid 图表的渲染
java·tomcat·mermaid·flexmark
小马爱打代码14 分钟前
Spring Boot:Sentinel 企业级熔断、降级与限流实战
spring boot·后端·sentinel