杰克逊使用枚举键POJO值反序列化为Map

ecbrodie:

我正在尝试使用Jackson将JSON反序列化为Java POJO。在不泄露机密信息的情况下,这是ObjectMapper的反序列化失败时的示例堆栈跟踪:

org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class

我的JSON看起来像这样:

"foo": {
    "coins": null,
    ...
}

我想反序列化的类具有以下字段:

private Map<MyEnum, MyPojo> foo;

我的枚举类型如下所示:

public enum MyEnum {
    COINS("coins"),
    ...
}

我确实意识到我正在尝试反序列化null值。但是我认为这仍然应该起作用:反序列化的结果应该等同于使用Map with foo.put(MyEnum.COINS, null),这确实是有效的Java指令。非常感谢您的帮助,在此先感谢您。

StaxMan:

除了提供一种好的解决方案(工厂方法)外,还有两种其他方法:

  • 如果“ MyEnum.toString()”返回“ coins”,则可以让Jackson在“ name()”上使用“ toString()”, ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
  • 您可以添加其他方法以返回要使用的id,并用@JsonValue注释标记该方法(实际上您也可以在其上使用它toString(),而不是启用上述功能)-如果该注释存在,则将该方法返回的值用作ID。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用杰克逊xml映射器将xml反序列化为pojo

从杰克逊的响应中使用指定的键反序列化为类

杰克逊将XML中的平面数组反序列化为Pojo列表

杰克逊反序列化为POJO而没有注释

杰克逊:反序列化为每个值都具有正确类型的Map <String,Object>

如何删除杰克逊反序列化的未知枚举键?

杰克逊:反序列化map <String,Object>到自定义嵌套Pojo

杰克逊:使用泛型将对象反序列化为数组

杰克逊无法使用枚举字段反序列化不可变对象

杰克逊使用泛型反序列化

反序列化xml时如何允许杰克逊使用重复键

使用杰克逊用重复的键反序列化json

杰克逊:使用类方法序列化POJO

使用父属性值对杰克逊进行多态反序列化

杰克逊:如何使用简写属性值反序列化json

如何使用杰克逊以不区分大小写的方式从Json对象反序列化为Boolean.class?

杰克逊:Map <String,Object>序列化和反序列化

用杰克逊将嵌套数组反序列化为ArrayList

杰克逊,将字符串反序列化为日期

杰克逊 将缺少的属性反序列化为空可选

用杰克逊反序列化为自定义对象的HashMap

杰克逊:父类的属性被忽略:将json反序列化为数据

强迫杰克逊反序列化为特定的原始类型

杰克逊:将json反序列化为Java映射,忽略某些条目

杰克逊将日期从Twitter反序列化为`ZonedDateTime`

杰克逊:反序列化的自定义XML中的属性POJO

杰克逊-反序列化一个基本枚举

杰克逊用多个名称反序列化枚举

使用writeValueAsString序列化的对象后杰克逊反序列化失败