本文为官方文档直译版本。原文链接
Spring Boot 提供与三个 JSON 映射库的集成:
Jackson 是首选的默认库。
Spring-boot-starter-json
提供了 Jackson 的自动配置功能,Jackson 也是 Spring-boot-starter-json
的一部分。当 Jackson 位于类路径上时,会自动配置 ObjectMapper
Bean。为自定义 ObjectMapper 的配置提供了多个配置属性。
如果使用 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 注册。由于 @JsonComponent
是用 @Component
元标注的,因此通常的组件扫描规则也适用。
Spring Boot 还提供了 [JsonObjectSerializer](https://github.com/spring-projects/spring-boot/blob/v3.2.0/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonObjectSerializer.java)
和 JsonObjectDeserializer 基类,在序列化对象时,它们为标准的 Jackson 版本提供了有用的替代方法。有关详细信息,请参见 Javadoc 中的 JsonObjectSerializer
和 JsonObjectDeserializer
。
上面的示例可以重写为使用 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);
}
}
}
Jackson 支持混入注解,可用于将附加注解混合到目标类已声明的注解中。Spring Boot 的 Jackson 自动配置会扫描应用程序的包,查找注释为 @JsonMixin
的类,并将它们注册到自动配置的 ObjectMapper
中。注册由 Spring Boot 的 JsonMixinModule
执行。
为 Gson 提供了自动配置功能。当 Gson 位于类路径上时,Gson
Bean 会自动配置。为自定义配置提供了多个 spring.gson.*
配置属性。要进行更多控制,可以使用一个或多个 GsonBuilderCustomizer
Bean。
提供 JSON-B 的自动配置。当 JSON-B API 和实现位于类路径上时,Jsonb
Bean 将自动配置。首选的 JSON-B 实现是 Eclipse Yasson,它提供了依赖关系管理。