首页 > 解决方案 > 如何在没有冗余的情况下为 Gson 中的 Option 自定义序列化器和反序列化器?

问题描述

我现在正在尝试自定义 Gson 中的序列化器和反序列化器Option<T>(使用io.vavr.control.Option,或者Optional<T>如果使用java.utils.*,这里类似)。

我想要的有两个要求:

  1. 我想在 JSON 和Option.none()as中序列化,这样就没有冗余(我假设里面的值是@NotNull)。nullOption.some("hello")"hello"Option.some
  2. 我也希望值在andOption<T>之后保持不变。serializedeserialze

所以,以下是我的尝试(是完整的代码,我正在参考这篇文章来解决泛型类型问题):

public static class OptionJsonAdapter<T> implements JsonSerializer<Option<T>>, JsonDeserializer<Option<T>> {
    private final Type typeOfT;

    public OptionJsonAdapter(Type typeOfT) {
        this.typeOfT = typeOfT;
    }

    @Override
    public JsonElement serialize(Option<T> src, Type typeOfSrc, JsonSerializationContext context) {
        if (src.isEmpty()) {
            return JsonNull.INSTANCE;
        } else {
            return context.serialize(src.get(), typeOfT);
        }
    }

    @Override
    public Option<T> deserialize(JsonElement json, Type typeOfRes, JsonDeserializationContext context) {
        if (json.isJsonNull()) {
            return Option.none();
        } else {
            return Option.some(context.deserialize(json, typeOfT));
        }
    }
}

但是,上面的代码无法将JSON反序列null化为Option.none(),即使我确实写了一个if (json.isJsonNull())分支,似乎永远无法到达if-true情况的逻辑分支, 在反序列化JsonNull时,Gson甚至没有调用我们自定义的deserialize()函数

那么,我怎样才能序列化和反序列Option化为我想要的呢?

标签: javajsongenericsgson

解决方案


推荐阅读