如果枚举映射键为空或未知,则忽略 JSON 反序列化
Ignore JSON deserialization if enum map key is null or unknown
我正在尝试使用 Jackson 将 JSON 反序列化为 Java POJO。
Json 看起来像
"foo": {
"one": {
"a":1,
"b":"string"
}
"three":{
"a":2
"b":"another"
}
...
}
我要反序列化的 class 有这个字段:
public class Myclass {
private Map<MyEnum, MyPojo> foo;
//setter and getter
public static MyPojo {
private int a;
private String b;
}
}
我的枚举类型如下所示:
public enum MyEnum {
one("data1"),two("data2")
@JsonValue
String data;
EnumAttrib(String data) {
this.data = data;
}
private static Map<String, MyEnum> ENUM_MAP = new HashMap();
static {
for (MyEnum a: MyEnum.values()) {
ENUM_MAP.put(a.data, a);
}
}
@JsonCreator
public static MyEnum fromData(String string) {
return ENUM_MAP.get(string);
}
}
只要我们 JSON 拥有由 MyEnum 捕获的已知密钥,此解决方案就可以很好地工作。如果未在 MyEnum
中定义,如何从序列化中跳过某些 JSON 元素(在此示例中为“three
”)
您需要启用 READ_UNKNOWN_ENUM_VALUES_AS_NULL
,在 ObjectMapper
:
上默认禁用
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
执行此操作时,结果 Map
将包含一个条目,其键等于 null
,值设置为 JSON
与未知字段之一相关的对象。如果不可接受,您需要编写自定义反序列化程序或在反序列化过程后删除 null
密钥。
要在 Map
中使用 null
键解决问题,您还可以在 POJO
中使用 EnumMap
:
private EnumMap<MyEnum, MyPojo> foo;
其中 null
键是不允许的,将被跳过。
另请参阅:
- Jackson deserializing into Map with an Enum Key, POJO Value
为了解决您的需求,如果您使用 Spring Boot
,请将其添加到您的 application.properties:
spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true
我正在尝试使用 Jackson 将 JSON 反序列化为 Java POJO。 Json 看起来像
"foo": {
"one": {
"a":1,
"b":"string"
}
"three":{
"a":2
"b":"another"
}
...
}
我要反序列化的 class 有这个字段:
public class Myclass {
private Map<MyEnum, MyPojo> foo;
//setter and getter
public static MyPojo {
private int a;
private String b;
}
}
我的枚举类型如下所示:
public enum MyEnum {
one("data1"),two("data2")
@JsonValue
String data;
EnumAttrib(String data) {
this.data = data;
}
private static Map<String, MyEnum> ENUM_MAP = new HashMap();
static {
for (MyEnum a: MyEnum.values()) {
ENUM_MAP.put(a.data, a);
}
}
@JsonCreator
public static MyEnum fromData(String string) {
return ENUM_MAP.get(string);
}
}
只要我们 JSON 拥有由 MyEnum 捕获的已知密钥,此解决方案就可以很好地工作。如果未在 MyEnum
three
”)
您需要启用 READ_UNKNOWN_ENUM_VALUES_AS_NULL
,在 ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
执行此操作时,结果 Map
将包含一个条目,其键等于 null
,值设置为 JSON
与未知字段之一相关的对象。如果不可接受,您需要编写自定义反序列化程序或在反序列化过程后删除 null
密钥。
要在 Map
中使用 null
键解决问题,您还可以在 POJO
中使用 EnumMap
:
private EnumMap<MyEnum, MyPojo> foo;
其中 null
键是不允许的,将被跳过。
另请参阅:
- Jackson deserializing into Map with an Enum Key, POJO Value
为了解决您的需求,如果您使用 Spring Boot
,请将其添加到您的 application.properties:
spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true