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

如何在Jackson中反序列化复杂的自定义枚举,而无需手动滚动JsonDeserializer?

鲍宁
2023-03-14

我有一个具有多个自定义属性的枚举。我能够序列化它,我创建了一个反序列化它的方法,但它不起作用:

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.JsonNode;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SomeEnum {
    SOME_VALUE("Blah blah blah", "Example description");

    private final String displayName;
    private final String description;

    ScheduleOptimizationRuleCode(String displayName, String description) {
        this.displayName = displayName;
        this.description = description;
    }

    public String getCode() { return this.name(); }

    public String getDisplayName() {
        return displayName;
    }

    public String getDescription() {
        return description;
    }

    @JsonCreator
    public static SomeEnum fromString(@JsonProperty("code") String value) {
         return SomeEnum.valueOf(value);
    }
}

序列化时,我得到以下(正确的)输出:

{
  "code": "SOME_VALUE",
  "displayName": "Blah blah blah", 
  "description": "Example description"
}

当反序列化时,我的理解是Jackson会查看我的JSON字符串的对象表示,找出属性,并将代码作为字符串传递给带注释的方法[code>fromString(),但它不起作用<代码>值始终为空。

我还尝试在@JsonCreator注释上配置“模式”(例如PROPERTIESDELEGATING),但它不起作用。我看到的所有示例都只有一个值,所以不存在这个问题。

我知道我可以手动滚动一个JsonDeserializer并将其连接起来...在杰克逊博士中,但这肯定不是那么复杂,我需要一个手工制作的反序列化器...

如何反序列化具有多个属性的枚举?

共有1个答案

卜方伟
2023-03-14

终于找到了一个反序列化枚举的示例,尽管这两个示例中只有一个有效。从查看他的枚举中,我看到他正在传递一个JsonNode。像魅力一样工作!

@JsonCreator
public static SomeEnum fromString(JsonNode json) {
     return SomeEnum.valueOf(json.get("code").asText());
}
 类似资料:
  • 问题内容: 我正在尝试并且未能对Jackson 2.5.4的枚举进行反序列化,并且我不太清楚我的情况。我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定。 我也尝试了吸气剂,但没有成功,这是我在其他地方看到的一种选择。他们都炸毁了: 我究竟做错了什么? 问题答案: 编辑: 从Jackson 2.6开始,您可以在枚举的每个元素上使用以指定其序列化/反序列化值(请参见此处): (此答案的其余

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

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

  • 我有一个具有名称字段的界面,如下所示: 然后我会得到HTTP 400错误请求错误代码,其中包含以下异常日志: 抽象类型只能用附加类型信息实例化 模块的层次结构是模块B依赖于模块a。我尝试使用@JsonTypeInfo,但模块之间的依赖关系是一个限制,不允许我在@JsonSubtypes注释中为类C中的字段f使用BField.class。

  • 我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?