首页 > 解决方案 > 如何使用 GSON 中的 @SerializedName 备用字段来反序列化嵌套对象?

问题描述

在反序列化中,我尝试使用 GSON 将不同的 JSON 节点映射到单个字段。

我有一个类中的下一个字段:

private List<MyObjects> pages;

传入的 json 可能是:

{
  "pages": [
    {
      "pageNumber": "1"
    }
  ]
}

或者

{
  "pages": {
    "list": [
      {
        "pageNumber": "1"
      }
    ]
  }
}

我正在尝试使用以下方法将页面数组映射到页面类字段:

@SerializedName(value = "pages", alternate = "pages.list")
public List<MyObjects> pages;

但它不起作用。

GSON 似乎不支持这一点。但也许有人知道为什么?

标签: javajsonserializationgsonjsonpath

解决方案


提问

如何在 GSON 中使用备用字段?

答案在于我在此处部分复制的文档(也许您已经知道全部或部分内容)。

提问

GSON 似乎不支持这一点。但也许有人知道为什么?

是的,也许一些 Gson 设计师可以回答这个问题。就我个人而言,我看不出它不能支持JSONPath该注释属性的任何原因。无论如何,我将专注于标题中的问题。

这不是@SerializedName.alternate现在的工作方式。如果您查看Gson API 规范

公共抽象字符串 [] 替代

返回: 反序列化时字段的替代名称

(所以名称不是路径)

以下是如何使用此注释的示例:

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"] 的字段都将反序列化为MyClassfield b。正如我所理解的那样,它不做的是将任何嵌套的 Json 对象反序列化到该带注释的字段。

目前,这两个pages领域对 Gson 来说似乎是不同的对象。


推荐阅读