猿问

将主类作为 JsonSubTypes 中的类型调用

有没有办法使用杰克逊注释来调用同一个类作为类型@JsonSubTypes?

解释如下:

我创建了这个具有许多子类型的大师类


@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type" )

@JsonSubTypes( { @Type( value = FirstClass.class, name = "first" )

                ,@Type( value = SecondClass.class, name = "second" )

                ,@Type( value = ThirdClass.class, name = "third" ) } )

@Data

public abstract class Master {

    public String name;

}

对于三个类(FirstClass、SecondClass 和 ThirdClass),它们包含不同的属性,在我的代码中我有 4 个不同的条件


if ( inputClass instanceof FirstClass){...}

else if ( inputClass instanceof SecondClass){...}

else if ( inputClass instanceof ThirdClass){...}

else if ( inputClass instanceof Master ){...}

我担心的是最后一个条件,其中inputClass 只有name和type属性,没有像其他情况一样的其他字段,所以我尝试通过将其添加到 JsonSubTypes 中来创建一个新类型


@Type( value = Master.class, name = "fourth" )

我把第四个条件改成了这个


if ( inputClass instanceof Master ){...}

但是当我使用此输入发送休息请求时


{

    "name":"test",

    "type":"fourth"

}

我收到此错误:


JSON解析错误:无法构造com.test.Master的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用附加类型信息进行实例化;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无法构造 com.test.Master 的实例


看来我需要创建一个没有属性的类来将其用作类型而不是使用 master,我不知道是否有更好的解决方案


这是所使用的类的示例(第一、第二和第三)


@Data

@EqualsAndHashCode( callSuper = true )

@JsonTypeName( "FirstClass" )

public class FirstClass extends Master {


    public FirstClass() { 

    }


    private String attributeA = null;

    //attributeB for SecondClass and attributeC for ThirdClass


}


弑天下
浏览 134回答 1
1回答

芜湖不芜

尝试这个@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type" )@JsonSubTypes( { @Type( value = FirstClass.class, name = "first" )                ,@Type( value = SecondClass.class, name = "second" )                ,@Type( value = ThirdClass.class, name = "third" ) } )public class Master {    public String name;}if ( master instanceof FirstClass){...} else if ( master instanceof SecondClass) {...} else if ( master instanceof ThirdClass){...} else if ( master instanceof Master ){...}并使用此请求来调用主条件{    "name":"test",    "type":"Master"}编辑:您可以使用 @JsonTypeName 作为特定名称@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type" )@JsonSubTypes( { @Type( value = FirstClass.class, name = "first" )                ,@Type( value = SecondClass.class, name = "second" )                ,@Type( value = ThirdClass.class, name = "third" ) } )@JsonTypeName("forth")public class Master {    public String name;}要求{    "name":"test",    "type":"forth"}
随时随地看视频慕课网APP

相关分类

Java
我要回答