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 JsonDeserializerKeyDeserializer实现上使用@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中的所有@JsonComponentbean 都会自动向 Jackson 注册。因为@JsonComponent是用元注解的@Component,所以通常的组件扫描规则适用。

Spring Boot 还提供了JsonObjectSerializerJsonObjectDeserializer基类,它们在序列化对象时提供了标准 Jackson 版本的有用替代方案。有关详细信息,请参阅JsonObjectSerializerJsonObjectDeserializer的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。

最后更新于