java - 如何使用 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 似乎不支持这一点。但也许有人知道为什么?
解决方案
提问
如何在 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"] 的字段都将反序列化为MyClass
field b
。正如我所理解的那样,它不做的是将任何嵌套的 Json 对象反序列化到该带注释的字段。
目前,这两个pages
领域对 Gson 来说似乎是不同的对象。
推荐阅读
- node.js - 使用 brew 全局安装 npm 包
- bit-src - 如何将简单的 bit-src 组件导入项目的 /src 文件夹?
- javascript - 无论屏幕大小如何,如何使带有图像的表格适合屏幕?
- tcsh - tcsh:如何在使用后清除命令行参数?
- angular - 获取 API 响应并将数据存储到数组中
- javascript - 如何获取有关 curried 函数的智能感知文档?
- java - Java备份mysqldump.exe绝对路径到相对路径
- git - 我将工作提交到 Git 上的错误分支
- python - for循环中str.count和str.index的时间复杂度是多少
- python - 当我运行此代码“TypeError:只能将 str(而不是“NoneType”)连接到 str”时出现此错误,为什么?