当前位置: 首页 > 知识库问答 >
问题:

Jackson用枚举键POJO值反序列化为映射

邵浩大
2023-03-14

我试图使用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
"foo": {
    "coins": null,
    ...
}
private Map<MyEnum, MyPojo> foo;

枚举类型如下所示:

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

我确实意识到我试图反序列化一个空值。但我认为这仍然有效:反序列化的结果应该等同于具有foo.put(Myenum.coins,null)的映射,这确实是一个有效的Java指令。非常感谢帮助,提前感谢。

共有1个答案

巫马盛
2023-03-14

除了一个很好的解决方案(工厂方法)外,还有另外两种方法:

  • 如果'myenum.tostring()'将返回“coins”,则可以让Jackson在objectmapper.enable(deserializationfeature.read_enums_using_to_string)
  • 中使用“tostring()”而不是“name()”
  • 您可以添加一些其他方法来返回要使用的id,并用@jsonvalue注释标记该方法(您实际上也可以在tostring()上使用该注释,而不是启用上述特性)--如果存在该注释,则该方法返回的值将用作id。
 类似资料:
  • 问题内容: 我正在尝试并且未能对Jackson 2.5.4的枚举进行反序列化,并且我不太清楚我的情况。我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定。 我也尝试了吸气剂,但没有成功,这是我在其他地方看到的一种选择。他们都炸毁了: 我究竟做错了什么? 问题答案: 编辑: 从Jackson 2.6开始,您可以在枚举的每个元素上使用以指定其序列化/反序列化值(请参见此处): (此答案的其余

  • 我正在尝试使用jackson-DataBind Objectmapper反序列化一个JSON字符串,其中包含一组枚举属性。当JSON中出现未在枚举中定义的未知属性时,就会发生这种情况。请在下面找到我正在使用的对象映射器配置。 但是,反序列化(ObjectMapper.ReadValue(jsonText,.class);)抛出此错误。“test”是要反序列化的JSON字符串中的未知属性。 Com.

  • 问题内容: 考虑以下枚举和类: 并考虑以下主要功能: 当前,该主输出为: 这种输出并不适合我,因为除了字符串的,我想它是,这是序号值在枚举。 所以我想要得到的实际结果是: 有一些优雅的方法可以使其表现为这种方式吗? 问题答案: 它应该通过指定映射器来工作。 如注解的Javadoc所述,这也适用于反序列化: 注意:当用于Java枚举时,一个附加功能是带注释的方法返回的值也被视为要反序列化的值,而不仅

  • 我有JSON反序列化和映射到枚举的问题。我从外部API获取JSON,类似于下面两个例子: 我想将空值映射到一些默认的枚举值。 模型对象 和枚举类 对于exists,值模型类包含正确的枚举,但如果我从API获取< code>null,它在模型中仍然是< code>null。 我试图创建一些由< code>@JsonCreator注释的方法,使用< code > @ JsonEnumDefaultVa

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • 我正在尝试从整数值反序列化scala枚举。 当我尝试反序列化这个字段时,它会抛出一个错误-的值com.example.TestEnum$JsonToken.VALUE_NUMBER_INT 我看到jackson doc建议在java中使用JsonCreator,但是没有提到scala enum。 我使用默认的ScalaMapper没有任何定制在这里。