如果枚举映射键为空或未知,则忽略 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 键。

要解决nullMap 中键入的问题,您还可以在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 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

MVC 返回json数据 怎么忽略序列化某个属性

来自 json 的原型反序列化将在新字段或未知枚举值上失败

Spring框架中的Jackson反序列化错误处理

反序列化 null 值以使用 Jackson 枚举

Spring Boot,Spring MVC JSON RequestBody:未知属性被忽略

使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错