java - 使用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)
- 我无法弄清楚用于序列化的 json 是什么,我不确定它是否可能。
- 我正在尝试使用“visible = true”打印类型信息但不成功。
解决方案
推荐阅读
- java - how to disable "this page is tracking your location"
- ios - IOS原生谷歌广告插上wifi可以正常显示,但是切换到4g就没有广告了
- javafx - TornadoFX: Compare 2 form values in ValidationContext
- python - How to correctly implement StratifiedKFold with RandomizedSearchCV
- android - Volley 给出运行时异常和没有协议的错误 url
- spring - 如何使用 Spring Boot 发送通知 (FCM)
- mysql - 带有 MySQL 迁移的 Django 不起作用
- javascript - 立即创建具有区域设置的日期
- css - Ionic 4: Style input placeholder
- javascript - Facebook 上不显示动态更改的 Open Graph 属性