JSON
Spring Boot 提供了与以下三种 JSON 映射库的集成:
- Gson
- Jackson
- JSON-B
其中, Jackson 是首选且默认使用的库。
Jackson
Spring Boot 提供了 Jackson 的自动配置,并且 Jackson 是 spring-boot-starter-json 的一部分。
当 Jackson 位于类路径中时,Spring Boot 会自动配置一个 ObjectMapper Bean。
此外,还提供了多个配置属性,用于自定义 ObjectMapper 的配置
自定义序列化和反序列化
如果您使用 Jackson 来序列化和反序列化 JSON 数据,可能需要编写自定义的 JsonSerializer 和 JsonDeserializer 类。
通常,自定义的序列化器通过 Jackson 模块进行注册,但 Spring Boot 提供了一个替代的 @JsonComponent 注解,使得直接注册 Spring Bean 更加方便。
您可以直接将 @JsonComponent 注解应用于 JsonSerializer 、 JsonDeserializer 或 KeyDeserializer 实现类。
此外,还可以将其应用于包含序列化器/反序列化器作为内部类的外部类。以下是一个示例:
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);
}
}
}所有 @JsonComponent Bean 都会被 ApplicationContext 自动注册到 Jackson 中。
由于 @JsonComponent 是用 @Component 元注解的,因此其遵循常规的组件扫描规则。
Spring Boot 还提供了 JsonObjectSerializer 和 JsonObjectDeserializer 基类,
相较于标准的 Jackson 版本,这些基类在序列化对象时提供了有用的替代方案。
有关详细信息,请参阅 API 文档中的 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);
}
}
}Mixins
Jackson 支持 mixins ,可以将额外的注解混入目标类上已有的注解中。Spring Boot 的 Jackson 自动配置会扫描应用程序包中带有 @JsonMixin 注解的类,并将其注册到自动配置的 ObjectMapper 中。这个注册操作由 Spring Boot 的 JsonMixinModule 执行。
Gson
Spring Boot 提供对 Gson 的自动配置。当类路径中包含 Gson 时,会自动配置一个 Gson Bean。
可以通过多个 spring.gson.* 配置属性来自定义 Gson 的配置。如果需要更高级的控制,可以定义一个或多个 GsonBuilderCustomizer Bean 来实现。
JSON-B
Spring Boot 提供对 JSON-B 的自动配置。当类路径中存在 JSON-B API 及其实现时,会自动配置一个 Jsonb Bean。推荐的 JSON-B 实现是 Eclipse Yasson,Spring Boot 已为其提供依赖管理支持
