Android 泛型Gson反序列化器

Android 泛型Gson反序列化器,android,json,gson,Android,Json,Gson,我有一个Api,该Api如下所示: 如果响应正常,则结构将以数据关键字开始,例如: { "data": { "name": "Rogelio Volkman", "address": "27299 Will Bridge Suite 058\nWest Reubenhaven, MI 00736", "lat": 54.65, "lng": 111.75, "phone": "+26(4)5015498663" } } 如果响应不正常(状态不是200),则响应将不会包含数据关键字,因此响应

我有一个Api,该Api如下所示:
如果响应正常,则结构将以
数据
关键字开始,例如:

{
"data": {
"name": "Rogelio Volkman",
"address": "27299 Will Bridge Suite 058\nWest Reubenhaven, MI 00736",
"lat": 54.65,
"lng": 111.75,
"phone": "+26(4)5015498663"
  }
}
如果响应不正常(状态不是200),则响应将不会包含
数据
关键字,因此响应将如下所示:

{
"message": "404 Not Found",
"status_code": 404
}
由于此结构是所有模型的通用结构,我打算为所有模型创建一个通用反序列化器。
这看起来像:

public class DataObjectDeserializer implements JsonDeserializer<Object> {

@Override
public Objectdeserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
        throws JsonParseException {
    // Get the "data" element from the parsed JSON
    JsonElement data = je.getAsJsonObject().get("data");

    // Deserialize it. You use a new instance of Gson to avoid infinite recursion
    // to this deserializer
    return new Gson().fromJson(data, Object.class);
  }
}
并向Gson注册它,比如
Gson Gson=new GsonBuilder().registerTypeHierarchyAdapter(DataObjectModel.class,new DataObjectDeserializer()).create()。但这也没有反序列化
博物馆
模型

问题是:我如何为父类创建一个反序列化器来同时反序列化子类(作为我的第二种方法),或者我如何使用Gson创建一个泛型类,以便围绕
数据
包装的每个tyoe都可以像这样使用:
公共类DataObjectDeserializer实现JsonDeserializer{

@Override
public DataObjectModel deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
        throws JsonParseException {
    // Get the "data" element from the parsed JSON
    JsonElement data = je.getAsJsonObject().get("data");

    // Deserialize it. You use a new instance of Gson to avoid infinite recursion
    // to this deserializer
    return new Gson().fromJson(data, DataObjectModel.class);
 }
} 
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
        throws JsonParseException {
    // Get the "data" element from the parsed JSON
    JsonElement data = je.getAsJsonObject().get("data");

    // Deserialize it. You use a new instance of Gson to avoid infinite recursion
    // to this deserializer
    return new Gson().fromJson(data, /* This part not working due to type erasing in java*/ T.calss);
 }
}

如果您像这样创建响应和数据结构

private class Data {

    @SerializedName("name")
    private String name;
    @SerializedName("address")
    private String address;
    @SerializedName("lat")
    private String lat;
    @SerializedName("lng")
    private String lng;
    @SerializedName("phone")
    private String phone;

}

private class Response {

    @SerializedName("message")
    private String message;
    @SerializedName("status_code")
    private int statusCode;
    @SerializedName("data")
    private Data data;

}
然后你就可以做了

Response response = new Gson().fromJson(json, Response.class);

if(response.statusCode == 0) {
    //everything ok, do something with response.data
} else {
    //display response.message, data will be null 
}

@EIDuderino是的,当然可以,但这需要我为每个gson反序列化创建2个模型,这不是优化的解决方案