我正在使用带有GSON的改进型来实现JSON序列化,并使用Realm来实现存储。
{
status : 1
data: { object data }
}
public class ResponseDeserializer implements JsonDeserializer {
@Override
public Object1 deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
{
JsonElement data = je.getAsJsonObject().get("data");
GsonBuilder gsonBuilder = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
});
Gson gson = gsonBuilder.create();
Object1 o1 = gson.fromJson(data, new TypeToken<Object1>() {}.getType());
return o1;
}
}
第一个问题:当我尝试将fromJson更改为泛型类型时,会产生一个带有对象键值对的“com.google.gson.internal.LinkedTreeMap”,代码:
public class ResponseDeserializer<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
{
JsonElement data = je.getAsJsonObject().get("data");
GsonBuilder gsonBuilder = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
});
Gson gson = gsonBuilder.create();
T o = gson.fromJson(data, new TypeToken<T>() {}.getType());
return o;
}
}
第二个问题:反序列化器如何根据json结果返回对象或对象列表。
现在我用一种不同的方法解决了它:
2列表和对象响应模型:
public class ApiResponse<T> {
private int success;
private String[] errors;
private String[] messages;
private T data;
}
public class ApiListResponse<T> {
private int success;
private String[] errors;
private String[] messages;
private List<T> data;
}
1响应模型的反序列化器
public class ResponseDeserializer<T> implements JsonDeserializer {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
JsonElement data = je.getAsJsonObject().get("data");
GsonBuilder gsonBuilder = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
});
Gson gson = gsonBuilder.create();
T response = gson.fromJson(je, type);
return response;
}
}
现在我可以为GSON注册类型,比如:
gsonBuilder.registerTypeAdapter(new TypeToken<ApiResponse<Object1>>() {}.getType(), new ResponseDeserializer<ApiResponse>());
gsonBuilder.registerTypeAdapter(new TypeToken<ApiListResponse<Object1>>() {}.getType(), new ResponseDeserializer<ApiListResponse>());
现在将正确转换以下JSON响应:
API响应
{
"data":{
"Object1Id":"1",
"Name":"Test 1",
},
"messages":[
],
"errors":[
],
"success":"1"
}
ApilistResponse
{
"data":[{
"Object1Id":"1",
"Name":"Test 1",
},{
"Object1Id":"2",
"Name":"Test 2",
}],
"messages":[
],
"errors":[
],
"success":"1"
}
有更好的解决方案吗?
问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问
我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数:
我想将这个对象序列化为JSON字符串 并得到如下结果: 我试着用 但不是这样,我得到了: 个性化序列化: 欢迎提出任何建议 谢谢,马里奥
我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"
问题内容: 我正在尝试使用Gson反序列化从Web服务返回的json字符串 该结构将以返回。 哪里像 和ItemDTO就像 当我按如下方式调用代码时 对象内部的所有内容均为空 但是,如果我使用 并将它们从org.json罐子中逐段拉出,效果很好,并相应地填充了字段。 关于我在做什么错的任何想法吗?Gson非常快吗?还是我最好坚持自己已经做的工作? 谢谢大卫 问题答案: 原始问题中的示例Java
主要内容:示例我们将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。 在这个例子中,创建一个类。 然后将对象列化后存储在文件中,该文件将具有对象的json表示形式。 示例 在中创建一个名为的Java类文件,参考以下代码 - 执行上面示例代码,得到以下结果 -