为特定类型的 JsonNullable 自定义反序列化过程的正确方法是什么

问题描述 投票:0回答:1

我想自定义

JsonNullable<Boolean>
反序列化过程。所以我找到了类 JsonNullableDeserializer :

我已经实现了自己的解串器:

public class MyJsonNullableDeserializer extends JsonNullableDeserializer {

    private static final long serialVersionUID = 1L;

    private boolean isBooleanDeserializer = false;
  
    public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
                                    TypeDeserializer typeDeser, JsonDeserializer<?> deser) {
          ....
        }
    }

    @Override
    public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonToken t = p.getCurrentToken();
        if (t == JsonToken.VALUE_STRING && isBooleanDeserializer && p.getText().trim().isEmpty() ) {
          throw new IllegaArgumentException("....");
        }
        return super.deserialize(p, ctxt);
    }

现在我想注册

MyJsonNullableDeserializer
但不知道如何注册。

我看到了类 JsonNullableDeserializers

public class JsonNullableDeserializers extends Deserializers.Base {

    @Override
    public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
                                                         DeserializationConfig config, BeanDescription beanDesc,
                                                         TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer) {
        return (refType.hasRawClass(JsonNullable.class)) ? new JsonNullableDeserializer(refType, null, contentTypeDeserializer,contentDeserializer) : null;
    }
}

看来我得换了

JsonNullableDeserializer
MyJsonNullableDeserializer
不知何故

我不知道如何更换它。你能帮忙吗?

spring-boot jackson json-deserialization jackson-databind jsonnullable
1个回答
0
投票

您走在正确的道路上! Spring 提供了使用自定义反序列化器来自定义对象反序列化的机制。以下是如何注册您的

MyJsonNullableDeserializer
以替换默认的
JsonNullableDeserializer
JsonNullable<Boolean>
:

  1. 实现JsonDeserializer

虽然您的 MyJsonNullableDeserializer 扩展了 JsonNullableDeserializer,但建议直接实现 JsonDeserializer 接口,以获得更好的类型安全性和清晰度。这可确保您的解串器仅处理

JsonNullable<Boolean>
对象。

  1. 重写反序列化方法:

在 MyJsonNullableDeserializer 类中,实现 deserialize(JsonParser p, DeserializationContext ctxt) 方法来处理 JsonNullable 的反序列化逻辑。您已经拥有用于处理空字符串的自定义逻辑。

  1. 注册自定义解串器:

您可以在此处利用 Spring 的 ObjectMapper 来注册自定义反序列化器:

// Assuming you have an ObjectMapper instance somewhere (e.g., a bean)
ObjectMapper mapper = ...;

// Create an instance of your MyJsonNullableDeserializer
MyJsonNullableDeserializer deserializer = new MyJsonNullableDeserializer();

// Register the deserializer for JsonNullable<Boolean> type
mapper.registerModule(new SimpleModule("MyBooleanNullableModule")
        .addDeserializer(JsonNullable.class, deserializer));

此代码片段创建一个名为“MyBooleanNullableModule”的 SimpleModule,并使用特定的 Boolean (JsonNullable) 目标为 JsonNullable.class 类型注册 MyJsonNullableDeserializer。

  1. 用途:

使用 ObjectMapper 注册反序列化器后,您可以使用它来反序列化包含 JsonNullable 字段的 JSON 数据。当遇到此类字段时,将应用反序列化方法中定义的自定义逻辑。

注意:请记住配置您的 ObjectMapper bean(如果适用)以使用包含自定义反序列化器的模块。这可确保整个应用程序的行为一致。

© www.soinside.com 2019 - 2024. All rights reserved.