前言
在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信息的处理等等。