首页 > 解决方案 > 使用jackson使用接口实现反序列化枚举

问题描述

界面。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes({ @Type(value = ExtendedPipelineType.class, name = "extended"),
        @Type(value = PipelineType.class, name = "basic"), })
public interface IPipelineType {
    String getPipelineType();
}

枚举一 - ExtendedPipelineType

public enum ExtendedPipelineType implements IPipelineType {
     // Rules Pipeline
     RUN_RULES_429$RULES_AIRPORT_PAIRS;
     @Override
     public String getPipelineType() {
          return this.toString();
     }
}

枚举二 - PipelineType

public enum PipelineType implements IPipelineType {

     // Rules Pipeline
     RUN_RULES_429(PipelineCategory.RULES);
     // Other Values

    public final PipelineCategory pipelineCategory;

     PipelineType(PipelineCategory pipelineCategory) {
          this.pipelineCategory = pipelineCategory;
     }

     public enum PipelineCategory {
          RULES, TBR;
     }

     @Override
     public String getPipelineType() {
          return this.toString();
     }
}

序列化和反序列化的示例程序。

public static void main(String[] args) throws JsonProcessingException {
          List<IPipelineType> pipelineTypes = new ArrayList<>();
          pipelineTypes.add(ExtendedPipelineType.RUN_RULES_429$RULES_AIRPORT_PAIRS);
          pipelineTypes.add(PipelineType.RUN_RULES_429);
          System.out.println(new ObjectMapper().writeValueAsString(pipelineTypes));
          // Prints: ["RUN_RULES_429$RULES_AIRPORT_PAIRS","RUN_RULES_429"]
          String s = "[{\"type\": \"extended\", \"pipelineType\":\"RUN_RULES_429$RULES_AIRPORT_PAIRS\"}]";
          List<IPipelineType> ips = new ObjectMapper().readValue(s, new TypeReference<List<IPipelineType>>() {});
     }

我收到以下错误

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `com.orchestrator.model.pipeline.ExtendedPipelineType` from Object value (token `JsonToken.FIELD_NAME`)
 at [Source: (String)"[{"type": "extended", "pipelineType":"RUN_RULES_429$RULES_AIRPORT_PAIRS"}]"; line: 1, column: 11] (through reference chain: java.util.ArrayList[0])
        at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
        at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1280)
        at com.fasterxml.jackson.databind.deser.std.EnumDeserializer._deserializeOther(EnumDeserializer.java:339)
        at com.fasterxml.jackson.databind.deser.std.EnumDeserializer.deserialize(EnumDeserializer.java:201)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:137)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:107)
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:263)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:349)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3531)
        at com.orchestrator.model.pipeline.ExtendedPipelineType.main(ExtendedPipelineType.java:41)
  1. 我无法弄清楚用于序列化的 json 是什么,我不确定它是否可能。
  2. 我正在尝试使用“visible = true”打印类型信息但不成功。

标签: javaenumsjackson

解决方案


推荐阅读