我正在使用以下结构:
class Family {
//...
Parent parent;
}
class Parent {
//...
}
class ChildA extends Parent {
//...
}
class ChildB extends Parent {
//...
}
我正在尝试反序列化Family
类型的JSON对象(使用Child
对象,而不是Parent
),但是我需要调整其中一个Child
,所以我尝试从Family
对象中提取Parent
属性,然后将其设置为等于Child
。但是,编译器说我需要对其进行类型转换,所以我试了一下,但是我得到了一个错误,基本上就是说我不能把一个超类类型转换成子类,这是有道理的。
现在我看到Family
对象只使用Parent
进行反序列化,而没有子类型。如何使用Child
属性而不是Parent
类型反序列化Family
?我不明白,因为Family
对象使用Child
对象发布到服务器,但是它仅通过Parent
属性被反串行化。
谢谢
在做了一些研究之后,我偶然发现了我相信可能是解决方案的一部分(尽管现在我有了一个新问题)
我以如下方式修改了我的课程:
class Family {
String address;
Parent parent;
}
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = ChildA.class, name = "A"),
@JsonSubTypes.Type(value = ChildB.class, name = "B")
})
class Parent {
String parentAttribute;
}
@JsonSubType("A")
class ChildA extends Parent {
String attributeA;
}
@JsonSubType("B")
class ChildB extends Parent {
String attributeB;
}
然而,现在当我尝试反序列化Family
类时,我得到了以下错误:com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class Family ]: missing type id property 'type' (for POJO property 'Parent')
在我的任何类中都没有type
字段,我想这可能与它有关。
下面是序列化的JSON字符串:
{
"Address": "123 Main St",
"Parent": {
"parentAttribute": "Mom",
"attributeA": "Child A Type"
}
}
理想情况下,当我执行反序列化时,我会在上面的同一个JSON字符串上执行它,但是上面的字符串不包括任何type
属性。有没有一种方法可以对反序列化进行某种预处理,并添加一个中间步骤(即添加一个类型字段?)
2条答案
按热度按时间evrscar21#
在添加这些注解之前,我可以将POJO序列化为JSON字符串,如下所示:
理想情况下,当我执行反序列化时,我会在上面的同一个JSON字符串上执行,但是要反序列化的dto不使用任何Child类型--我猜想它不知道如何Map哪个Child对象,所以它只使用Parent,但我的知识在这里是有限的。
据我所知,这恐怕不太可能,因为它不是现成的,而且不太可能轻易地使用自定义反序列化代码。
试着从反序列化器的Angular 考虑:你需要一些东西来定义JSON对象以将它们Map到Java类。目前我只能看到一些子属性的存在和缺失。这将需要相当多的逻辑来完成Map。
如果可以更改JSON格式,最简单的方法是将属性添加到您在以下注解中指定的Parent(此处为:类型):
例如,您可以将此属性的值硬编码传递给父构造函数,以确保序列化对象始终具有正确的值。
3qpi33ja2#
我能够利用
Parent
类上的一个属性在没有“type”字段的情况下可以被利用这一事实来解决这个问题。问题是要序列化的JSON字符串不包含“type”字段,因此不使用:
我将“type”更改为该属性名称:
这解决了我在尝试反序列化对象时遇到的问题。然而,它最终是一个变通方案,因为它没有解决最初的问题(在反序列化过程中进行某种形式的修改以添加额外的“类型”字段),但我不确定如何进行此操作。