不支持为@SerializedName
Gson的一个字段定义多个注释。
原因: 默认情况下,反序列化由LinkedHashMap管理,并且密钥由传入的json的字段名(而不是自定义类的字段名或serializedNames)定义,并且存在一对一的映射。您可以在ReflectiveTypeAdapterFactory
类的内部类Adapter<T>
的read(JsonReader in)
方法中查看实现(反序列化的工作方式)。
解决办法:
你可以写一个自定义的TypeAdapter负责处理name
,person
而user
JSON标签,并将它们映射到您的自定义类的名称字段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();
}
}
测试用例:
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"}
有关TypeAdapter的示例。
编辑2016.04.06:正如@Mathieu Castets在他的回答中所写,现在受支持。(这是此问题的正确答案。)
public abstract String [] Alternative
返回:字段反序列化时的备用名称
默认值: {}