java - 如何在没有冗余的情况下为 Gson 中的 Option 自定义序列化器和反序列化器?
问题描述
我现在正在尝试自定义 Gson 中的序列化器和反序列化器Option<T>
(使用io.vavr.control.Option
,或者Optional<T>
如果使用java.utils.*
,这里类似)。
我想要的有两个要求:
- 我想在 JSON 和
Option.none()
as中序列化,这样就没有冗余(我假设里面的值是@NotNull)。null
Option.some("hello")
"hello"
Option.some
- 我也希望值在and
Option<T>
之后保持不变。serialize
deserialze
所以,以下是我的尝试(这是完整的代码,我正在参考这篇文章来解决泛型类型问题):
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
化为我想要的呢?
解决方案
推荐阅读
- java - 即使服务器的主机密钥存在于 known_hosts 文件中,JSch 连接也会因 UnknownHostKey 而失败
- javascript - JS的线性变换和矩阵乘法失败
- python - 替换部分 url 并循环遍历所有页面
- django - 我的代码运行 Django 后出现问题渲染模板
- javascript - 如何从本地 JSON 文件中检索 HTML 复选框的状态?
- android - Android 10 上的 TelephonyManager 崩溃
- django - 如何检查用户是否以前在 Django 中进行了身份验证?
- python-3.x - 纸牌游戏 - 比较纸牌并在两名玩家之间玩五轮
- python - 创建一个新列,其中包含另一列中某个值的出现次数
- android - 无法弄清楚如何修复 Firebase 安全规则