如果枚举映射键为空或未知,则忽略 JSON 反序列化
Posted
技术标签:
【中文标题】如果枚举映射键为空或未知,则忽略 JSON 反序列化【英文标题】:Ignore JSON deserialization if enum map key is null or unknown 【发布时间】:2019-07-29 21:22:10 【问题描述】:我正在尝试使用 Jackson 将 JSON 反序列化为 Java POJO。 Json 看起来像
"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
”)
【问题讨论】:
可能是这样的***.com/questions/16446619/… 【参考方案1】:您需要启用READ_UNKNOWN_ENUM_VALUES_AS_NULL
,在您的ObjectMapper
上默认禁用该功能:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL);
执行此操作时,结果Map
将包含一个条目,其键等于null
,值设置为JSON
与未知字段之一相关的对象。如果不可接受,您需要编写自定义反序列化器或在反序列化过程后删除 null
键。
要解决null
在Map
中键入的问题,您还可以在POJO
中使用EnumMap
:
private EnumMap<MyEnum, MyPojo> foo;
其中null
键是不允许的,将被跳过。
另见:
Jackson deserializing into Map with an Enum Key, POJO Value【讨论】:
【参考方案2】:为了解决您的要求,如果您使用的是Spring Boot
,请将其添加到您的 application.properties:
spring.jackson.deserialization.READ_UNKNOWN_ENUM_VALUES_AS_NULL=true
【讨论】:
以上是关于如果枚举映射键为空或未知,则忽略 JSON 反序列化的主要内容,如果未能解决你的问题,请参考以下文章