我有一个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);
}
}
如果您像这样创建响应和数据结构
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.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?