多个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:您可以编写一个处理namepersonuser 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 []替代
返回:反序列化时的字段的替代名称
默认: {}