gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:22:54 25 4
gpt4 key购买 nike

有没有办法使用 jackson 注释@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 只有 nametype 属性,没有像其他情况一样的其他字段,所以我尝试通过将其添加到 JsonSubTypes 来创建一个新类型

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

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

if ( inputClass instanceof Master ){...}

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

{
"name":"test",
"type":"fourth"
}

我收到此错误:

JSON parse error: Can not construct instance of com.test.Master, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of 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

}

最佳答案

试试这个

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

关于java - 将主类作为 JsonSubTypes 中的类型调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com