每个字段有多个GSON@SerializedName?
Gson中有没有办法将多个JSON字段映射到单个Java对象成员变量
假设我有一个Java类
public class MyClass {
String id;
String name;
}
我想将这个类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同
{ "id": 2341, "person": "Bob" }
。。。而且
{ "id": 5382, "user": "Mary" }
。。。分别
有没有办法将JSON字符串中的"person"
和"user"
字段映射到Java对象中的name
字段
(注意:我只需要将JSON字符串转换为Java对象,而不是相反。)
# 1 楼答案
对于Kotlin风扇
# 2 楼答案
对于KOTLIN,我在下面使用过,但不起作用
所以我编辑了它,在这里它工作得很好
# 3 楼答案
2015年10月,Gson 2.4版(changelog)增加了在反序列化时为
@SerializedName
使用备用/多个名称的功能。不再需要自定义类型适配器用法:
爪哇
科特林
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
# 4 楼答案
不支持在Gson为字段定义多个
@SerializedName
注释原因:默认情况下,反序列化由LinkedHashMap管理,键由传入json的字段名(而不是自定义类的字段名或序列化数据名)定义,并且存在一对一映射。您可以在
ReflectiveTypeAdapterFactory
类的内部类Adapter<T>
的read(JsonReader in)
方法中看到实现(反序列化如何工作)解决方案: 您可以编写一个自定义TypeAdapter,它处理
name
、person
和user
json标记,并将它们映射到自定义类的名称字段MyClass
:测试用例:
Examples about TypeAdapters.
编辑2016.04.06:正如@Mathieu Castets在其回答中所写的,现在它得到了支持。(这是这个问题的正确答案。)