json 当我在java中反序列化一个类时,我怎样反序列化才能使该类的任何父对象属性都反序列化为只有子对象?

vpfxa7rd  于 2022-12-15  发布在  Java
关注(0)|答案(2)|浏览(226)

我正在使用以下结构:

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属性。有没有一种方法可以对反序列化进行某种预处理,并添加一个中间步骤(即添加一个类型字段?)

evrscar2

evrscar21#

在添加这些注解之前,我可以将POJO序列化为JSON字符串,如下所示:

{
     "Address": "123 Main St",
     "Parent": {
          "parentAttribute": "Mom",
          "attributeA": "Child A Type"
     }
 }

理想情况下,当我执行反序列化时,我会在上面的同一个JSON字符串上执行,但是要反序列化的dto不使用任何Child类型--我猜想它不知道如何Map哪个Child对象,所以它只使用Parent,但我的知识在这里是有限的。
据我所知,这恐怕不太可能,因为它不是现成的,而且不太可能轻易地使用自定义反序列化代码。
试着从反序列化器的Angular 考虑:你需要一些东西来定义JSON对象以将它们Map到Java类。目前我只能看到一些子属性的存在和缺失。这将需要相当多的逻辑来完成Map。
如果可以更改JSON格式,最简单的方法是将属性添加到您在以下注解中指定的Parent(此处为:类型):

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

例如,您可以将此属性的值硬编码传递给父构造函数,以确保序列化对象始终具有正确的值。

3qpi33ja

3qpi33ja2#

我能够利用Parent类上的一个属性在没有“type”字段的情况下可以被利用这一事实来解决这个问题。
问题是要序列化的JSON字符串不包含“type”字段,因此不使用:

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

我将“type”更改为该属性名称:

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

这解决了我在尝试反序列化对象时遇到的问题。然而,它最终是一个变通方案,因为它没有解决最初的问题(在反序列化过程中进行某种形式的修改以添加额外的“类型”字段),但我不确定如何进行此操作。

相关问题