Gson错误“为多个继承的字段声明了命名的JSON字段”

时间:2018-11-05 06:23:19

标签: java json inheritance gson

我有2个课程:

父母

class Parent {
    @SerializedName("variable1")
    int variable1;

    @SerializedName("child")
    Child child;

    //Getters and Setters
}

孩子

class Child {
    @SerializedName("childVar")
    int childVar1;

    //Getters and Setters
}

这些扩展如下:

ExtendedChild

class ExtendedChild extends Child {
    @SerializedName("childVar2")
    int childVar2;

    //Getters and Setters
}

扩展父母

class ExtendedParent extends Parent {
    @SerializedName("variable2")
    int variable2; 

    @SerializedName("child")
    ExtendedChild extendedChild;

    //Getters and Setters
}

我想将这些类用于从Json取消编组。我打算使用GSON库。我想根据有效载荷取消编组到ExtendedParent或Parent类。我在代码中知道它是哪种类型的Parent。为了正确表示和避免多余的变量声明,我想使用继承。以下是我的两个示例-

我将下面的有效载荷封送给ExtendedParent.class

{
    'variable1':12,
    'variable2':23,
    'child':{
        'childVar1': 43,
        'childVar2': 23
    }
}

我将下面的有效载荷封送给Parent.class

{
    'variable1':12,
    'child':{
        'childVar1': 43
    }
}

但是,当我尝试以以下方式取消编组时,

ExtendedParent extendedParent = new Gson()
        .fromJson('<Passing the first Json string above>', ExtendedParent.class);

我面临以下例外。

  

java.lang.IllegalArgumentException:类ExtendedParent声明   多个名为child的JSON字段

无法找出问题所在。任何帮助或指针将不胜感激。我尝试了几种方法来避免在Child对象上隐藏变量,但是无法解决该问题。

1 个答案:

答案 0 :(得分:0)

无论是Java字段名称还是序列化名称,GSON都不应对多次声明具有相同名称的字段。使用泛型来避免这种情况。像这样声明您的Parent

public class Parent<T extends Child> {
    private T child;
    // any other stuff
}

ExtendedParent,例如:

public class ExtendedParent extends Parent<ExtendedChild> {
    // note no more declaring the field "child"
    // any other stuff
}

如果您需要使用名称extendedChild,则可以为该名称创建用child处理的吸气剂和塞特阀。

相关问题here