我有一个抽象类的具体对象。
我在抽象类和子类上使用注释,但JSON输出看起来不正确,而且我一直在反序列化上遇到异常。
我还在学习杰克逊,不幸的是,很多关于这个主题的教程已经过时了。
以下是底部有我的对象映射器的类:
抽象类:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "BTRFSPhysicalLocationItem")
@JsonSubTypes({
@Type(name = "Snapshot", value = Snapshot.class),
@Type(name = "Backup", value = Backup.class),
@Type(name = "Subvolume", value = Subvolume.class)})
public abstract class BTRFSPhysicalLocationItem {
private final String name;
@JsonProperty
private final Path location;
/**
* Makes a new subvolume instance with the specified location. May or may
* not actually exist.
*
* @param location The location of the subvolume
*/
@JsonCreator
protected BTRFSPhysicalLocationItem(@JsonProperty(value = "location") Path location) {
this.location = location;
this.name = location.getFileName().toString();
}
混凝土等级:
public class Subvolume extends BTRFSPhysicalLocationItem {
/**
* Creates a new subvolume with the specified path.The subvolume may or may
* not exist at this point.
*
* @param location
*/
@JsonCreator
public Subvolume(@JsonProperty Path location) {
super(location);
}
Objectmapper块:
ObjectMapper MAPPER = new ObjectMapper();
List<Subvolume> SUBVOLUME_LIST = new ArrayList<>();
//Subvolume is populated by other methods it's not worth showing them here
System.out.println("\n\n");
MAPPER.writeValue(System.out, SUBVOLUME_LIST);
System.out.println("\n\n\n");
var s = MAPPER.writeValueAsString(SUBVOLUME_LIST);
List<Subvolume> list = MAPPER.readValue(s, new TypeReference<List<Subvolume>>() {
});
输出JSON:[{"name":"wanderingEcho","位置":"file:///home/sarah/NetBeansProjects/wanderingEcho/"}]
例外:
Aug 05, 2019 4:55:14 PM com.protonmail.sarahszabo.wanderingecho.btrfs.BTRFS <clinit>
SEVERE: null
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.protonmail.sarahszabo.wanderingecho.btrfs.subvolume.Subvolume]: missing type id property 'BTRFSPhysicalLocationItem'
at [Source: (String)"[{"name":"WanderingEcho","location":"file:///home/sarah/NetBeansProjects/WanderingEcho/"}]"; line: 1, column: 89] (through reference chain: java.util.ArrayList[0])
其他答案(例如多态类型的Jackson反序列化)建议使用ObjectMapper
方法,但根据我阅读的教程,这应该没有必要。
不知道我在注释上做错了什么。
在您的json
中,您缺少BTRFSP物理位置项目
-想想看-Jackson应该如何知道您期望什么实现?
应该是这样的
[
{
"BTRFSPhysicalLocationItem": "Subvolume",
"name": "WanderingEcho",
"location":"file:///home/sarah/NetBeansProjects/WanderingEcho/"
}
]
如果希望Jackson在序列化对象时包含该类型,还需要添加JsonTypeInfo。像属性作为包括作为@JsonTypeInfo注释的参数
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "BTRFSPhysicalLocationItem")
“编辑确定”似乎我已经解决了这个问题-您不生成属性的问题与Java类型的擦除有关,并在这里进行了详细描述。
TLDR;杰克逊对不可靠类型有问题-似乎<代码>列表
解决方案是创建一个将扩展ArrayList的帮助类
public class SubvolumeList extends ArrayList<Subvolume> {}
此外,您的代码中还有一些问题——一个是您应该使用
use=JsonTypeInfo。如果您想按属性值(如
子卷
)而不是包/类字符串文字进行反序列化,请在@JsonTypeInfo
中输入ID. NAME
其次,您应该在参数列表中命名JsonProperty,如JsonProperty(value=“location”)
我有来自API的响应文本。当我试图创建一个新的游戏从这个响应我得到一个错误: 错误:未处理的异常:“列表”类型不是“列表”类型的子类型 我在尝试使用JSON文本时遇到如下错误: 错误: 未处理的异常:“列表”类型不是“列表”类型的子类型 它指向游戏类中的这一行: 有什么建议吗?
我是颤振初学者。我得到这样的JSON响应时出错。 我一直在论坛上寻找这个问题,我发现是这样的。 但我不懂如何编写函数。这是我的密码。 还有像这样的错误。 我很抱歉问了同样的问题,因为我不明白
我有点被某些情况困住了。 1)
我试图从API获取数据。我得到了错误类型列表不是地图的子类型。我是新来的,不明白我在哪里犯了错误。 这是我的回帖功能: 在我的主屏幕中,我使用了一个,如下所示: 如何解决此错误?提前谢谢。
我正在对地图执行firestore查询 没有人工作过,任何帮助都是感激的 谢谢你抽出时间
我试图从服务器获取JSON响应并将其输出到控制台。 未处理的异常:类型“\u InternalLinkedHashMap” 原因可能是什么?