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資料,您可能需要編寫自己的ValueSerializerValueDeserializer類。自定義序列化器通常透過模組與Jackson註冊,但Spring Boot提供了一個替代的@JacksonComponent註解,使得直接註冊Spring Bean更加容易。

您可以直接在ValueSerializerValueDeserializerKeyDeserializer實現上使用@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還提供了ObjectValueSerializerObjectValueDeserializer基類,它們在序列化物件時提供了標準Jackson版本的有用替代方案。有關詳細資訊,請參閱API文件中的ObjectValueSerializerObjectValueDeserializer

上面的示例可以重寫為使用ObjectValueSerializerObjectValueDeserializer,如下所示

  • 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.*配置屬性用於自定義配置。

© . This site is unofficial and not affiliated with VMware.