我有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对象上隐藏变量,但是无法解决该问题。
答案 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。