使用 JSON-B / Yasson 忽略枚举大小写
Ignore enum case with JSON-B / Yasson
使用JSON-B / Yasson 有没有办法在反序列化时忽略枚举的大小写?
public class MyObject{
MyEnum condition;
//getters and setters
}
public enum MyEnum{
NEW, OLD, REFURBISHED;
}
部分传入JSON:"condition" : "new"
问题是传入的 JSON 使用小写的枚举。
我不认为这应该是开箱即用的。因为从技术上讲,您可以同时拥有 old
和 OLD
作为枚举的有效值,所以允许开箱即用的大写转换可以打破往返等价。考虑序列化一个 MyEnum.old
值以在反序列化时得到一个 MyEnum.OLD
值。
但是,您可以使用适配器强制执行此类行为。
public static class MyAdapter implements JsonbAdapter<MyEnum, String> {
@Override
public String adaptToJson(MyEnum value) {
return value.name();
}
@Override
public MyEnum adaptFromJson(String s) {
return MyEnum.valueOf(s.toUpperCase());
}
}
接下来,用 @JsonbTypeAdapter
.
注释枚举
@JsonbTypeAdapter(MyAdapter.class)
public enum MyEnum {
NEW,
OLD,
REFURBISHED;
}
或者,您可以按如下方式创建 Jsonb 提供程序。
Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new MyAdapter()));
使用JSON-B / Yasson 有没有办法在反序列化时忽略枚举的大小写?
public class MyObject{
MyEnum condition;
//getters and setters
}
public enum MyEnum{
NEW, OLD, REFURBISHED;
}
部分传入JSON:"condition" : "new"
问题是传入的 JSON 使用小写的枚举。
我不认为这应该是开箱即用的。因为从技术上讲,您可以同时拥有 old
和 OLD
作为枚举的有效值,所以允许开箱即用的大写转换可以打破往返等价。考虑序列化一个 MyEnum.old
值以在反序列化时得到一个 MyEnum.OLD
值。
但是,您可以使用适配器强制执行此类行为。
public static class MyAdapter implements JsonbAdapter<MyEnum, String> {
@Override
public String adaptToJson(MyEnum value) {
return value.name();
}
@Override
public MyEnum adaptFromJson(String s) {
return MyEnum.valueOf(s.toUpperCase());
}
}
接下来,用 @JsonbTypeAdapter
.
@JsonbTypeAdapter(MyAdapter.class)
public enum MyEnum {
NEW,
OLD,
REFURBISHED;
}
或者,您可以按如下方式创建 Jsonb 提供程序。
Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new MyAdapter()));