多个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 []替代
返回:反序列化时的字段的替代名称
默认: {}