当前位置: 首页 > 知识库问答 >
问题:

泛型Gson反序列化器

常炯
2023-03-14

我有一个Api,Api如下所示:
如果响应是ok,那么结构将以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"
  }
}
{
"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);
  }
}
@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创建一个泛型类,这样包装在data周围的每个tyoe都可以与它一起使用,比如:
public class DataObjectDeserializer implements 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);
 }
}

共有1个答案

虞航
2023-03-14

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

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 
}
 类似资料:
  • 问题内容: 我正在使用GSON 1.4,并使用两个通用对象序列化对象,如下所示 。当我对它进行反序列化时 可悲的是我得到了 java.lang.IllegalArgumentException:无法将java.util.ArrayList字段…设置为java.util.LinkedList 这是为什么 ?GSON文档指出,如果我使用object.class参数进行序列化,则它支持泛型。任何想法?谢

  • 您将获得对象(或对象列表),而不是作为传递的实际对象(或第二种情况下的实际对象列表)。 如果您想要一个仍然想要反序列化泛型类型对象(-s),请参阅下面的答案。 +红利:LoopJ+GSON的最终通用解决方案 如何获取泛型接口的具体类型 Java类型Generic作为GSON的参数

  • 我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)

  • 我想通过Google Gson传输一个列表对象,但我不知道如何反序列化泛型类型。 我在看了这个之后尝试了什么(Balusc的回答): 编辑: 现在我有 但是,我确实在“FromJson”行得到以下异常: null

  • 这是保存过程开始的地方。我定义了一个抽象方法,以后在运行时已知的类中实现。 这里我知道的类型,我想调用一个方法。 所以问题是ConfigurationPersistenceHelper中的方法。运行此方法时,配置中得到的不是而是。 我知道我可以在每个具体应用程序类的方法中实现反序列化器逻辑。但这会导致大量重复代码。这是我目前的解决方案。 此外,我知道我可以将类型从(其中类型在运行时仍然可用)传递给

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?