Java 每个字段有多个GSON@SerializedName?
Gson中有没有办法将多个JSON字段映射到单个Java对象成员变量 假设我有一个Java类Java 每个字段有多个GSON@SerializedName?,java,json,gson,Java,Json,Gson,Gson中有没有办法将多个JSON字段映射到单个Java对象成员变量 假设我有一个Java类 public class MyClass { String id; String name; } 我想将这个类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同 { "id": 2341, "person": "Bob" } 。。。而且 { "id": 5382, "user": "Mary" } 。。。分别 有没有办法将JSON字符串中的“person”和“us
public class MyClass {
String id;
String name;
}
我想将这个类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同
{ "id": 2341, "person": "Bob" }
。。。而且
{ "id": 5382, "user": "Mary" }
。。。分别
有没有办法将JSON字符串中的“person”
和“user”
字段映射到Java对象中的name
字段
(注意:我只需要将JSON字符串转换为Java对象,而不是相反的方式。)不支持在Gson为一个字段定义多个
@SerializedName
注释
原因:默认情况下,反序列化由LinkedHashMap管理,键由传入json的字段名(而不是自定义类的字段名或序列化数据名)定义,并且存在一对一映射。您可以在reflectTypeAdapterFactory
类的内部类Adapter
的read(JsonReader-in)
方法中看到实现(反序列化的工作方式)
解决方案:
您可以编写一个处理name
、person
和user
json标记的自定义类,并将它们映射到自定义类的name字段MyClass
:
class MyClassTypeAdapter extends TypeAdapter<MyClass> {
@Override
public MyClass read(final JsonReader in) throws IOException {
final MyClass myClassInstance = new MyClass();
in.beginObject();
while (in.hasNext()) {
String jsonTag = in.nextName();
if ("id".equals(jsonTag)) {
myClassInstance.id = in.nextInt();
} else if ("name".equals(jsonTag)
|| "person".equals(jsonTag)
|| "user".equals(jsonTag)) {
myClassInstance.name = in.nextString();
}
}
in.endObject();
return myClassInstance;
}
@Override
public void write(final JsonWriter out, final MyClass myClassInstance)
throws IOException {
out.beginObject();
out.name("id").value(myClassInstance.id);
out.name("name").value(myClassInstance.name);
out.endObject();
}
}
编辑2016.04.06:正如@Mathieu Castets在其回答中所写的,现在它得到了支持。(这是这个问题的正确答案。)
公共抽象字符串[]备选Returns: 反序列化时的字段
默认值:{}
2015年10月,Gson版本2.4()添加了在反序列化时为
@SerializedName
使用备用/多个名称的功能。不再需要自定义类型适配器
用法:
String jsonVal0 = "{\"id\": 5382, \"user\": \"Mary\" }";
String jsonVal1 = "{\"id\": 2341, \"person\": \"Bob\"}";
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyClass.class, new MyClassTypeAdapter());
final Gson gson = gsonBuilder.create();
MyClass myClassInstance0 = gson.fromJson(jsonVal0, MyClass.class);
MyClass myClassInstance1 = gson.fromJson(jsonVal1, MyClass.class);
System.out.println("jsonVal0 :" + gson.toJson(myClassInstance0));
// output: jsonVal0 :{"id":5382,"name":"Mary"}
System.out.println("jsonVal1 :" + gson.toJson(myClassInstance1));
// output: jsonVal1 :{"id":2341,"name":"Bob"}
@SerializedName(value="name", alternate={"person", "user"})
对于Kotlin粉丝
@SerializedName(value="name", alternate= ["person", "user"])
对于KOTLIN,我在下面使用过,但不起作用
@SerializedName(value="name", alternate= ["person", "user"])
所以我编辑了它,在这里它工作得很好
@SerializedName(value="name", alternate= arrayOf("person", "user"))
这里是简单完美的解释这里是简单完美的解释太棒了!谢谢你的回答!当我添加alternate时,它显示了错误:java.lang.IllegalArgumentException:无法为类创建转换器,声明了多个名为的JSON字段。这是一个简单而完美的解释