このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Boot 3.5.7 を使用してください!

JSON

Spring Boot は、次の JSON マッピングライブラリとの統合を提供します。

  • Jackson 3

  • Jackson 2

  • Gson

  • JSON-B

  • Kotlin 直列化

Jackson 3 は、推奨されるデフォルトのライブラリです。

Support for Jackson 2 is deprecated and will be removed in a future Spring Boot 4.x release. It is provided purely to ease the migration from Jackson 2 to Jackson 3 and should not be relied up in the longer term.

Jackson 3

Jackson 3 には自動構成が提供されており、Jackson は spring-boot-starter-json の一部です。Jackson がクラスパス上にある場合、JsonMapper (英語) (Bean)が自動的に構成されます。JsonMapper の設定をカスタマイズするにはいくつかの構成プロパティが提供されています。

カスタムシリアライザーとデシリアライザー

Jackson を使用して JSON データを直列化およびデ直列化する場合は、独自の ValueSerializer (英語) クラスと ValueDeserializer (英語) クラスを作成することをお勧めします。カスタムシリアライザーは通常、モジュールを介して Jackson に登録されます [GitHub] (英語) が、Spring Boot では、Spring Bean を直接登録しやすくする代替の @JacksonComponent (Javadoc) アノテーションが提供されています。

@JacksonComponent (Javadoc) アノテーションは、ValueSerializer (英語) ValueDeserializer (英語) 、または KeyDeserializer (英語) 実装で直接使用できます。また、次の例に示すように、シリアライザー / デシリアライザーを内部クラスとして含むクラスで使用することもできます。

  • 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 (Javadoc) 内のすべての @JacksonComponent (Javadoc) Bean は、自動的に Jackson に登録されます。@JacksonComponent (Javadoc) @Component (Javadoc) でメタアノテーションが付けられているため、通常のコンポーネントスキャンルールが適用されます。

Spring Boot は、オブジェクトを直列化するときに標準の Jackson バージョンの便利な代替手段となる ObjectValueSerializer (Javadoc) および ObjectValueDeserializer (Javadoc) 基本クラスも提供します。詳細については、API ドキュメントの ObjectValueSerializer (Javadoc) および ObjectValueDeserializer (Javadoc) を参照してください。

上記の例は、次のように ObjectValueSerializer (Javadoc) ObjectValueDeserializer (Javadoc) を使用して書き直すことができます。

  • 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 (Javadoc) でアノテーションされたクラスを探し、自動構成された JsonMapper (英語) に登録します。登録は Spring Boot の JacksonMixinModule (Javadoc) によって実行されます。

Jackson 2

Deprecated auto-configuration for Jackson 2 is provided by the spring-boot-jackson2 module. When this module is on the classpath a ObjectMapper (英語) bean is automatically configured. Several spring.jackson2.* configuration properties are provided for customizing the configuration. To take more control, define one or more Jackson2ObjectMapperBuilderCustomizer (Javadoc) beans.

When both Jackson 3 and Jackson 2 are present, various configuration properties can be used to indicate that Jackson 2 is preferred:

  • spring.graphql.rsocket.preferred-json-mapper

  • spring.http.codecs.preferred-json-mapper (used by Spring WebFlux and reactive HTTP clients)

  • spring.http.converters.preferred-json-mapper (used by Spring MVC and imperative HTTP clients)

  • spring.rsocket.preferred-mapper

  • spring.websocket.messaging.preferred-json-mapper

In each case, set the relevant property to jackson2 to indicate that Jackson 2 is preferred.

Gson

Gson の自動構成が提供されます。Gson がクラスパス上にある場合、Gson (英語) Bean が自動的に構成されます。構成をカスタマイズするための spring.gson.* 構成プロパティがいくつか提供されます。より細かく制御するには、1 つ以上の GsonBuilderCustomizer (Javadoc) Bean を使用できます。

JSON-B

JSON-B の自動構成が提供されます。JSON-B API と実装がクラスパス上にある場合、Jsonb (英語) Bean が自動的に構成されます。優先される JSON-B 実装は、依存関係管理が提供される Eclipse Yasson です。

Kotlin 直列化

Kotlin 直列化の自動構成が提供されています。kotlinx-serialization-json がクラスパス上にある場合、Json (英語) Bean が自動的に構成されます。設定をカスタマイズするための spring.kotlin.serialization.* 構成プロパティがいくつか提供されています。