【问题标题】:JSON Binding @JsonbTypeDeserializer annotation ignored on enums?JSON绑定@JsonbTypeDeserializer注释在枚举上被忽略了吗?
【发布时间】:2020-03-06 23:29:48
【问题描述】:

我正在将 JAXB 应用程序转换为 JSON-B,但在我的一个测试中尝试使用自定义 JsonbDeserializer 反序列化 Java 枚举时遇到了问题。

我需要反序列化的原始 JSON 包含引用枚举常量的 ints。因此我的自定义JsonbDeserializer 需要采用int 并返回具有匹配ordinal 的枚举常量。它看起来像这样:

@JsonbTypeDeserializer(Region.RegionDeserializer.class)
public enum Region implements BaseEnum {

    REGION_A,
    REGION_B;

    static final class RegionDeserializer implements JsonbDeserializer<Region> {

        // deserialize() method returns REGION_A for 0 and REGION_B for 1.

    }
}

然后我像这样运行它:

try (var jsonb = JsonbBuilder.create()) {
    var result = jsonb.fromJson(text, Region.class);
} catch (final Exception ex) {
    fail(ex);
}

不幸的是,这是我得到的结果:

java.lang.IllegalArgumentException: No enum constant Region.1
    at java.base/java.lang.Enum.valueOf(Enum.java:266)
    at org.eclipse.yasson.internal.serializer.EnumTypeDeserializer.deserialize(EnumTypeDeserializer.java:40)

如您所见,RegionDeserializer 未被使用。相反,使用默认的枚举反序列化器。查看 JSON-B 文档,我发现我应该手动注册反序列化器:

JsonbConfig config = new JsonbConfig()
    .withDeserializer(RegionDeserializer.class);
Jsonb jsonb = JsonbBuilder.create(config);
...

当我这样做时,代码实际上是有效的。但这是我的问题 - 我该怎么做才能自动注册 JsonbTypeDeserializer 注释?考虑到我有很多需要自定义反序列化器的枚举,手动注册它们确实无法扩展。

编辑 1: 我尝试改用 @JsonbCreator-annotated 静态方法,结果是一样的。仍然使用默认的枚举反序列化器。

【问题讨论】:

    标签: java resteasy jsonb-api yasson


    【解决方案1】:

    JSON-B 规范提到了注册自定义反序列化器的两种方式:

    注册JsonbSerializer/JsonbDeserializer有两种方式:

    • 使用JsonbConfig::withSerializers/JsonbConfig::withDeserializers方法;
    • 使用JsonbSerializer/JsonbDeserializer 注解对类型进行注解。

    注释不起作用的事实是一个错误。我可以在 Yasson 1.0.6 上重现这一点,但不能在 Yasson 2.0.0-M1 上重现。也许更新到最新版本可以解决您的问题?

    【讨论】:

    • 我同意这确实是一个错误。我会把它和项目一起归档。
    • 你知道这个错误是否已经解决了吗?因为我认为我面临着同样的问题。
    • 我无法在 Yasson 2.0.0-M1 上重现该问题。你用的是什么版本,@freedev?
    • @Martijn 感谢您回来,不确定我使用的是什么版本,因为它是我未定义的依赖项。但我在这里rmannibucau.metawerx.net/post/jsonb-enum-serialization 找到了一个工作 解决方案。希望这会有所帮助
    猜你喜欢
    • 2012-09-09
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2012-09-09
    • 2015-01-09
    • 2023-03-22
    相关资源
    最近更新 更多