JSON
Spring Boot提供了與以下JSON對映庫的整合
-
Jackson 3
-
Jackson 2
-
Gson
-
JSON-B
-
Kotlin序列化
Jackson 3是首選的預設庫。
對Jackson 2的支援已棄用,並將在未來的Spring Boot 4.x版本中移除。它僅用於簡化從Jackson 2到Jackson 3的遷移,不應長期依賴。
Jackson 3
為Jackson 3提供了自動配置,Jackson是spring-boot-starter-json的一部分。當Jackson位於類路徑中時,會自動配置一個JsonMapper bean。提供了多個配置屬性,用於自定義JsonMapper的配置。
自定義序列化器和反序列化器
如果您使用Jackson來序列化和反序列化JSON資料,您可能需要編寫自己的ValueSerializer和ValueDeserializer類。自定義序列化器通常透過模組與Jackson註冊,但Spring Boot提供了一個替代的@JacksonComponent註解,使得直接註冊Spring Bean更加容易。
您可以直接在ValueSerializer、ValueDeserializer或KeyDeserializer實現上使用@JacksonComponent註解。您也可以將其用於包含序列化器/反序列化器作為內部類的類,如下例所示
-
Java
-
Kotlin
import tools.jackson.core.JsonGenerator;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ValueDeserializer;
import tools.jackson.databind.ValueSerializer;
import org.springframework.boot.jackson.JacksonComponent;
@JacksonComponent
public class MyJacksonComponent {
public static class Serializer extends ValueSerializer<MyObject> {
@Override
public void serialize(MyObject value, JsonGenerator jgen, SerializationContext context) {
jgen.writeStartObject();
jgen.writeStringProperty("name", value.getName());
jgen.writeNumberProperty("age", value.getAge());
jgen.writeEndObject();
}
}
public static class Deserializer extends ValueDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) {
JsonNode tree = jsonParser.readValueAsTree();
String name = tree.get("name").stringValue();
int age = tree.get("age").intValue();
return new MyObject(name, age);
}
}
}
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonParser
import tools.jackson.databind.DeserializationContext
import tools.jackson.databind.JsonNode
import tools.jackson.databind.SerializationContext
import tools.jackson.databind.ValueDeserializer
import tools.jackson.databind.ValueSerializer
import org.springframework.boot.jackson.JacksonComponent
@JacksonComponent
class MyJacksonComponent {
class Serializer : ValueSerializer<MyObject>() {
override fun serialize(value: MyObject, jgen: JsonGenerator, serializers: SerializationContext) {
jgen.writeStartObject()
jgen.writeStringProperty("name", value.name)
jgen.writeNumberProperty("age", value.age)
jgen.writeEndObject()
}
}
class Deserializer : ValueDeserializer<MyObject>() {
override fun deserialize(jsonParser: JsonParser, ctxt: DeserializationContext): MyObject {
val tree = jsonParser.readValueAsTree<JsonNode>()
val name = tree["name"].stringValue()
val age = tree["age"].intValue()
return MyObject(name, age)
}
}
}
ApplicationContext中的所有@JacksonComponent bean都會自動註冊到Jackson。因為@JacksonComponent用@Component進行了元註解,所以適用常規的元件掃描規則。
Spring Boot還提供了ObjectValueSerializer和ObjectValueDeserializer基類,它們在序列化物件時提供了標準Jackson版本的有用替代方案。有關詳細資訊,請參閱API文件中的ObjectValueSerializer和ObjectValueDeserializer。
上面的示例可以重寫為使用ObjectValueSerializer和ObjectValueDeserializer,如下所示
-
Java
-
Kotlin
import tools.jackson.core.JsonGenerator;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.SerializationContext;
import org.springframework.boot.jackson.JacksonComponent;
import org.springframework.boot.jackson.ObjectValueDeserializer;
import org.springframework.boot.jackson.ObjectValueSerializer;
@JacksonComponent
public class MyJacksonComponent {
public static class Serializer extends ObjectValueSerializer<MyObject> {
@Override
protected void serializeObject(MyObject value, JsonGenerator jgen, SerializationContext context) {
jgen.writeStringProperty("name", value.getName());
jgen.writeNumberProperty("age", value.getAge());
}
}
public static class Deserializer extends ObjectValueDeserializer<MyObject> {
@Override
protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, JsonNode tree) {
String name = nullSafeValue(tree.get("name"), String.class);
int age = nullSafeValue(tree.get("age"), Integer.class);
return new MyObject(name, age);
}
}
}
import tools.jackson.core.JsonGenerator
import tools.jackson.core.JsonParser
import tools.jackson.databind.DeserializationContext
import tools.jackson.databind.JsonNode
import tools.jackson.databind.SerializationContext
import org.springframework.boot.jackson.JacksonComponent;
import org.springframework.boot.jackson.ObjectValueDeserializer
import org.springframework.boot.jackson.ObjectValueSerializer
@JacksonComponent
class MyJacksonComponent {
class Serializer : ObjectValueSerializer<MyObject>() {
override fun serializeObject(value: MyObject, jgen: JsonGenerator, context: SerializationContext) {
jgen.writeStringProperty("name", value.name)
jgen.writeNumberProperty("age", value.age)
}
}
class Deserializer : ObjectValueDeserializer<MyObject>() {
override fun deserializeObject(jsonParser: JsonParser, context: DeserializationContext,
tree: JsonNode): MyObject {
val name = nullSafeValue(tree["name"], String::class.java) ?: throw IllegalStateException("name is null")
val age = nullSafeValue(tree["age"], Int::class.java) ?: throw IllegalStateException("age is null")
return MyObject(name, age)
}
}
}
混入(Mixins)
Jackson支援混入,可用於將附加註解混入已在目標類上宣告的註解中。Spring Boot的Jackson自動配置將掃描您的應用程式包中帶有@JacksonMixin註解的類,並將其註冊到自動配置的JsonMapper。註冊由Spring Boot的JacksonMixinModule執行。
Jackson 2
spring-boot-jackson2模組提供了已棄用的Jackson 2自動配置。當此模組位於類路徑上時,會自動配置一個ObjectMapper bean。提供了多個spring.jackson2.*配置屬性用於自定義配置。要進行更多控制,請定義一個或多個Jackson2ObjectMapperBuilderCustomizer bean。
當Jackson 3和Jackson 2都存在時,可以使用各種配置屬性來指示Jackson 2是首選
-
spring.graphql.rsocket.preferred-json-mapper -
spring.http.codecs.preferred-json-mapper(由Spring WebFlux和響應式HTTP客戶端使用) -
spring.http.converters.preferred-json-mapper(由Spring MVC和命令式HTTP客戶端使用) -
spring.rsocket.preferred-mapper -
spring.websocket.messaging.preferred-json-mapper
在每種情況下,將相關屬性設定為jackson2以表示Jackson 2是首選。
Gson
提供了Gson的自動配置。當Gson位於類路徑上時,會自動配置一個Gson bean。提供了多個spring.gson.*配置屬性用於自定義配置。要進行更多控制,可以使用一個或多個GsonBuilderCustomizer bean。
JSON-B
提供了JSON-B的自動配置。當JSON-B API和實現位於類路徑上時,會自動配置一個Jsonb bean。首選的JSON-B實現是Eclipse Yasson,為其提供了依賴管理。
Kotlin序列化
提供了Kotlin序列化的自動配置。當kotlinx-serialization-json位於類路徑上時,會自動配置一個Json bean。提供了多個spring.kotlinx.serialization.json.*配置屬性用於自定義配置。