JSON 在枚举上忽略绑定 @JsonbTypeDeserializer 注释?
JSON Binding @JsonbTypeDeserializer annotation ignored on enums?
我正在将 JAXB 应用程序转换为 JSON-B,并且在尝试使用内部的自定义 JsonbDeserializer
反序列化 Java 枚举时遇到了 运行 问题我的一项测试。
我需要反序列化的原始 JSON 包含引用枚举常量的 int
。因此,我的自定义 JsonbDeserializer
需要采用 int
和 return 匹配 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
-注释的静态方法,结果是一样的。仍然使用默认的枚举解串器。
JSON-B 规范提到了两种注册自定义解串器的方法:
There are two ways how to register JsonbSerializer/JsonbDeserializer:
- Using
JsonbConfig::withSerializers
/JsonbConfig::withDeserializers
method;
- Annotating a type with
JsonbSerializer
/JsonbDeserializer
annotation.
注释不起作用的事实是一个错误。我可以在 Yasson 1.0.6 上重现它,但不能在 Yasson 2.0.0-M1 上重现。也许更新到最新版本可以解决您的问题?
我正在将 JAXB 应用程序转换为 JSON-B,并且在尝试使用内部的自定义 JsonbDeserializer
反序列化 Java 枚举时遇到了 运行 问题我的一项测试。
我需要反序列化的原始 JSON 包含引用枚举常量的 int
。因此,我的自定义 JsonbDeserializer
需要采用 int
和 return 匹配 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
-注释的静态方法,结果是一样的。仍然使用默认的枚举解串器。
JSON-B 规范提到了两种注册自定义解串器的方法:
There are two ways how to register JsonbSerializer/JsonbDeserializer:
- Using
JsonbConfig::withSerializers
/JsonbConfig::withDeserializers
method;- Annotating a type with
JsonbSerializer
/JsonbDeserializer
annotation.
注释不起作用的事实是一个错误。我可以在 Yasson 1.0.6 上重现它,但不能在 Yasson 2.0.0-M1 上重现。也许更新到最新版本可以解决您的问题?