我有一个api,api看起来像这样:
如果响应正常,则结构将以data
关键字开头,例如:
{
"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),则响应不会是容器data
关键字,因此响应将如下所示:
{
"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);
}
}
然后将其注册为typeAdapter Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Object.class, new DataObjectDeserializer()).create();
由于每个对象都是Object的一个实例,我认为这可以工作(反序列化我的Museum
模型),但事实并非如此。
在我的第二次尝试中,我创建了一个名为DataObjectModel
和类Museum
扩展DataObjectModel
的抽象类。然后创建了一个像以下一样的deserailizer:
公共类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);
}
}
并将其注册为Gson,如Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(DataObjectModel.class, new DataObjectDeserializer()).create();
。但这并没有反序列化Museum
模型。
问题是:如何为父类创建一个反序列化器,它也会反序列化子类(作为我的第二种方法)或者我如何使用Gson创建一个泛型类,以便每个包裹在一起的tyoe {{1可以像它一样使用它:
公共类DataObjectDeserializer实现JsonDeserializer {
data
答案 0 :(得分:0)
如果您创建这样的响应和数据结构
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
}