为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2023-12-30 16:07:25
有没有办法使用杰克逊注释来调用同一个类作为类型@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" ) } )@Datapublic 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}
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

尝试这个


@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"

}


查看完整回答
反对 回复 2023-12-30
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信