多个GSON @SerializedName每个字段?
在Gson中有没有办法将多个JSON字段映射到单个Java对象成员variables?
假设我有一个Java类…
public class MyClass { String id; String name; } 我想用两个不同的服务来使用这个单独的类。 但是,这两种服务在返回数据方面有所不同。
 { "id": 2341, "person": "Bob" } 
…和…
 { "id": 5382, "user": "Mary" } 
… 分别。
 有没有办法将JSONstring中的"person"和"user"字段映射到Java对象的name字段? 
(注:我只需要从JSONstring转换为Java对象 – 从来没有其他方式。)
  2015年10月, Gson版本2.4 (更新日志 )添加了在反序列@SerializedName时使用@SerializedName替代/多个名称的@SerializedName 。 没有更多的自定义TypeAdapter需要! 
用法:
 @SerializedName(value="name", alternate={"person", "user"}) 
https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html
 不支持在Gson的字段中定义多个@SerializedName注释。 
  原因:默认情况下,反序列化是通过LinkedHashMap进行pipe理的,键是由传入的json的字段名(而不是自定义类的字段名或序列化名)定义的,并且有一对一的映射。 您可以在ReflectiveTypeAdapterFactory类的内部类Adapter<T>的read(JsonReader in)方法中看到实现(如何反序列化read(JsonReader in) 。 
  解决scheme:您可以编写一个处理name , person和user json标签的自定义TypeAdapter ,并将它们映射到您的自定义类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(); } } 
testing用例:
  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在他的回答中写的,现在已经被支持了。 (这是这个问题的正确答案。)
公共抽象String []替代
返回:反序列化时的字段的替代名称
默认: {}