Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理jackson的接口?_Java_Json_Serialization_Jackson_Abstract - Fatal编程技术网

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的文章在这里很有帮助。谢谢!我已经解决了它!但我现在还有一个问题。我向我们描述了一个注释。关于