7.7. JSON
Spring Boot 提供与三个 JSON 映射库的集成:
gson
Jackson
JSON-B
Jackson 是首选的默认库。
7.7.1. Jackson
提供了 Jackson 的自动配置,并且 Jackson 是spring-boot-starter-json
. 当 Jackson 在类路径上时,ObjectMapper
会自动配置一个 bean。提供了几个配置属性用于自定义ObjectMapper
.
6.1.1. 自定义序列化器和反序列化器
如果您使用 Jackson 来序列化和反序列化 JSON 数据,您可能需要编写自己的JsonSerializer
类和JsonDeserializer
类。自定义序列化程序通常通过模块向 Jackson 注册,但 Spring Boot 提供了一个@JsonComponent
注解,可以更轻松地直接注册 Spring Bean。
您可以直接在JsonSerializer
JsonDeserializer
或KeyDeserializer
实现上使用@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
和JsonObjectDeserializer
基类,它们在序列化对象时提供了标准 Jackson 版本的有用替代方案。有关详细信息,请参阅JsonObjectSerializer
和JsonObjectDeserializer
的Javadoc。
上面的例子可以重写为使用JsonObjectSerializer
/JsonObjectDeserializer
如下:
@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);
}
}
}
7.7.1.2. 混合
Jackson 支持 mixins,可用于将其他注解混合到已在目标类上声明的注释中。Spring Boot 的 Jackson 自动配置将扫描您应用程序的包以查找带有@JsonMixin
注解的类,并将它们注册到自动配置的ObjectMapper
中。通过 Spring Boot 的JsonMixinModule
注册.
7.7.2. gson
提供了 Gson 的自动配置。当 Gson 在类路径上时,会自动配置一个Gson
bean。提供了几个spring.gson.*
配置属性用于自定义配置。要进行更多控制,可以使用一个或多个GsonBuilderCustomizer
bean。
7.7.3. JSON-B
提供了 JSON-B 的自动配置。当 JSON-B API 和实现在类路径上时,将自动配置一个Jsonb
bean。首选的 JSON-B 实现是为其提供依赖管理的 Apache Johnzon。
最后更新于
这有帮助吗?