【问题标题】:Generic Type Gson deserializer通用类型 Gson 解串器
【发布时间】:2016-04-04 20:47:42
【问题描述】:

我有一个 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"
  }
}

如果响应不是 Ok(状态不是 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。然后创建了另一个除轨器,例如:
公共类 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 创建一个泛型类,以便包裹在 data 周围的每个 tyoe可以像这样使用它:
公共类 DataObjectDeserializer 实现 JsonDeserializer {

@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);
 }
}

【问题讨论】:

    标签: android json gson


    【解决方案1】:

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

    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 个模型,这不是那么优化的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多