Java 如何处理jackson的接口?
我正在处理这个问题。我有这门课:Java 如何处理jackson的接口?,java,json,serialization,jackson,abstract,Java,Json,Serialization,Jackson,Abstract,我正在处理这个问题。我有这门课: public class SemaphoreResponse { ISemaphore semaphore; StatusHolder statusHolder; public SemaphoreResponse() { super(); } // Getters and setters } 我想把我的json字符串转换成那个类,它抛出了这个异常 org.codehaus.jackson.map.Js
public class SemaphoreResponse {
ISemaphore semaphore;
StatusHolder statusHolder;
public SemaphoreResponse() {
super();
}
// Getters and setters
}
我想把我的json字符串转换成那个类,它抛出了这个异常
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.despegar.henry.automation.services.semaphoreservice.response.ISemaphore, problem: abstract types can only be instantiated with additional type information
at [Source: java.io.StringReader@17a5f5a5; line: 1, column: 2] (through reference chain: com.despegar.henry.automation.services.semaphoreservice.response.SemaphoreResponse["semaphore"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233)
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:60)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
所以,我知道这是因为“信号量”属性,这是一个接口,所以我知道我必须像这样添加@JsonDeseralize
@JsonDeserialize(as = [class-name].class)
public interface ISemaphore {
public abstract String getId();
public abstract void setId(String id);
public abstract String getOwnerUserId();
}
但这是我的问题。SemaphoreResponse中的属性信号并不总是使用同一个类。因此,我有两个不同的类,分别称为“MainSemaphore”和“ExecutionSemaphore”,它们都实现了接口ISemaphore。因此,在进行反序列化时,我希望将接口适配的类作为参数传递
大概是
@JsonDeserialize(as = MainSemaphore.class) or @JsonDeserialize(as = ExecutionSemaphore.class) depending the case
我怎么能这么做?非常感谢您的帮助除了ProgrammerBruce的优秀文章中描述的完整多态处理之外,还有一种更简单的方法可以支持简单的接口/impl,一对一,case:通过模块注册映射:
SimpleModule m=新的SimpleModule(…);
m、 addAbstractTypeMapping(ISemaphore.class,SemaphoreImpl.class);
映射器注册表模块(m);
这将指示Jackson总是使用具体的类
SemaphoreImpl
反序列化声明为ISemaphore
的东西。有几种方法可以做到这一点。请参阅@llawj引用中引用的处理多态性的正确方法,但我怀疑您不会得到预期序列化信号量的结果…谢谢!它帮助了我!你知道如何设置属性路径吗?我在任何地方都找不到这个。因为我正在映射StatusHolder属性(现在是一个抽象类)并使多态性依赖于位于信号量中的“type”属性。你知道怎么做吗?我不知道我是否清楚,否则请告诉我。对于多个实现,您确实需要在接口上使用@JsonTypeInfo
注释;JSON必须以某种方式包含类型id(作为附加属性,或者使用包装器对象或数组,其中类型id是键(对于对象)或第一个元素(对于数组)…因此ProgrammerBruce的文章在这里很有帮助。谢谢!我已经解决了它!但我现在还有一个问题。我向我们描述了一个注释。关于