如何在GSON中使用@SerializedName备用字段反序列化嵌套对象?

时间:2018-09-21 16:46:15

标签: java json serialization gson jsonpath

在反序列化中,我尝试使用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似乎不支持此功能。但是也许有人知道为什么?

1 个答案:

答案 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而言似乎是不同的对象。