在反序列化中,我尝试使用GSON将不同的JSON节点映射到单个字段。
我在课程中有下一个字段:
private List<MyObjects> pages;
传入的json可能是:
{
"pages": [
{
"pageNumber": "1"
}
]
}
或
{
"pages": {
"list": [
{
"pageNumber": "1"
}
]
}
}
我正在尝试使用以下方法将页面数组映射到 pages 类字段:
@SerializedName(value = "pages", alternate = "pages.list")
public List<MyObjects> pages;
但它不起作用。
GSON似乎不支持此功能。但是也许有人知道为什么?
答案 0 :(得分:0)
问题
如何在GSON中使用备用字段?
答案就在于我在此处部分复制的文档(也许您已经知道全部或部分内容)。
问题
似乎GSON不支持此功能。但是也许有人知道为什么?
是的,也许某些Gson设计师可以回答这个问题。就我个人而言,在该注释属性中,我看不出它不支持JSONPath
的任何原因。无论如何,我将专注于标题中的问题。
这不是@SerializedName.alternate
现在的工作方式。如果您看一下Gson API specs:
公共抽象String []替代
返回: 反序列化字段时的备用名称
(所以名称不是路径)
以下是此批注应如何使用的示例:
public class MyClass { @SerializedName("name") String a; @SerializedName(value="name1", alternate={"name2", "name3"}) String b;
和
换句话说,在反序列化时,它只是将要反序列化的名称不同的字段映射到某个字段和同一字段。它不会映射反序列化时,注释中指定的所有值将为 反序列化到该领域。例如:
MyClass target = gson.fromJson("{'name1':'v1'}", MyClass.class); assertEquals("v1", target.b); target = gson.fromJson("{'name2':'v2'}", MyClass.class); assertEquals("v2", target.b); target = gson.fromJson("{'name3':'v3'}", MyClass.class); assertEquals("v3", target.b);
Json
源中备用路径中的字段。不过,这可能是一个不错的功能。
因此,在API文档示例中,名称为[“ name1”,“ name2”,“ name3”]的所有字段都将反序列化为MyClass
字段b
。据我了解,它没有做的是将任何嵌套的Json对象反序列化到该带注释的字段。
目前,这两个pages
字段对于Gson而言似乎是不同的对象。