[英]Ignore JSON deserialization if enum map key is null or unknown
我正在尝试使用Jackson将JSON反序列化为Java POJO。 杰森看起来像
"foo": {
"one": {
"a":1,
"b":"string"
}
"three":{
"a":2
"b":"another"
}
...
}
我想反序列化的类具有以下字段:
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
READ_UNKNOWN_ENUM_VALUES_AS_NULL
其禁用:
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
键是不允许的,将被跳过。
也可以看看:
为了满足您的要求,如果您使用的是Spring Boot
,请将其添加到application.properties中:
spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.