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

相关推荐
rgeshfgreh2 分钟前
Spring事务传播机制深度解析
java·前端·数据库
无名-CODING3 分钟前
Java Spring 事务管理深度指南
java·数据库·spring
xiaolyuh1233 分钟前
Spring MVC Bean 参数校验 @Validated
java·spring·mvc
蕨蕨学AI10 分钟前
【Wolfram语言】45.2 真实数据集
java·数据库
Mr -老鬼21 分钟前
Rust适合干什么?为什么需要Rust?
开发语言·后端·rust
予枫的编程笔记24 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
ohoy30 分钟前
RedisTemplate 使用之Set
java·开发语言·redis
mjhcsp30 分钟前
C++ 后缀数组(SA):原理、实现与应用全解析
java·开发语言·c++·后缀数组sa
123445238 分钟前
Agent入门实战-一个题目生成Agent
人工智能·后端
IT_陈寒40 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端