https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#features.json
Spring Boot为三种JSON映射库提供了集成:
- Gson
- Jackson
- JSON-B
Jackson是首选的、默认的库。
Jackson
为Jackson提供了自动配置,并且Jackson是spring-boot-starter-json
的一部分。当Jackson在类路径上时,将自动配置一个ObjectMapper
bean。为自定义ObjectMapper
的配置提供了几个配置属性。
自定义序列化器和反序列化器(Custom Serializers and Deserializers)
如果你使用Jackson来序列化和反序列化JSON数据,你可能需要编写自己的JsonSerializer
和JsonDeserializer
类。自定义序列化器通常通过模块与Jackson进行注册,但Spring Boot提供了一个替代的@JsonComponent
注解,可以更方便地直接注册Spring Beans。
你可以直接在JsonSerializer
、JsonDeserializer
或KeyDeserializer
的实现上使用@JsonComponent
注解。你还可以在包含序列化器/反序列化器的内部类的类上使用它,如下所示:
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
jgen.writeEndObject();
}
}
public static class Deserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectCodec codec = jsonParser.getCodec();
JsonNode tree = codec.readTree(jsonParser);
String name = tree.get("name").textValue();
int age = tree.get("age").intValue();
return new MyObject(name, age);
}
}
}
在ApplicationContext
中的所有@JsonComponent
bean都会被自动被注册为Jackson的序列化器或反序列化器,从而可以处理JSON数据的序列化和反序列化。由于@JsonComponent
是通过@Component
进行元注解的,因此通常的组件扫描规则适用。
Spring Boot还提供了JsonObjectSerializer
和JsonObjectDeserializer
基类,当序列化对象时,它们为标准的Jackson版本提供了有用的替代方案。
上面的示例可以使用JsonObjectSerializer
/JsonObjectDeserializer
重写,如下所示:
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.boot.jackson.JsonObjectDeserializer;
import org.springframework.boot.jackson.JsonObjectSerializer;
@JsonComponent
public class MyJsonComponent {
public static class Serializer extends JsonObjectSerializer<MyObject> {
@Override
protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
jgen.writeStringField("name", value.getName());
jgen.writeNumberField("age", value.getAge());
}
}
public static class Deserializer extends JsonObjectDeserializer<MyObject> {
@Override
protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
JsonNode tree) throws IOException {
String name = nullSafeValue(tree.get("name"), String.class);
int age = nullSafeValue(tree.get("age"), Integer.class);
return new MyObject(name, age);
}
}
}
Mixins
Jackson支持mixins,可以将额外的注解混入到目标类上已经声明的注解中。Spring Boot的Jackson自动配置将扫描应用程序的包以查找带有@JsonMixin
注解的类,并使用自动配置的ObjectMapper
进行注册。注册操作由Spring Boot的JsonMixinModule
执行。
Gson
Spring Boot提供了Gson的自动配置。当Gson在类路径上时,将自动配置一个Gson
bean。提供了几个spring.gson.*
配置属性来定制配置。为了获得更多控制,可以使用一个或多个GsonBuilderCustomizer
beans。
JSON-B
Spring Boot提供了JSON-B的自动配置。当JSON-B API及其实现位于类路径上时,将自动配置一个Jsonb
bean。首选的JSON-B实现是Eclipse Yasson
,已为其提供依赖管理。