我正在使用gson的领域。我有一个模态,它有一个int类型字段的列表。Realm当前不支持原语列表。要解决这个问题,有一个解决方案。我创建了我的RealmInt类。
import io.realm.RealmObject;
public class RealmInt extends RealmObject {
private int val;
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
}
我有一个大的模态物体。。
public class Product extends RealmObject {
@PrimaryKey
private int productID;
private int priority;
private boolean isFavourite;
.....
.....
.....
private RealmList<Document> documents;
private RealmList<ProductInfoGroup> productInfoGroups;
private RealmList<RealmInt> categories;
我必须将下面的json数组反序列化为Product modals。
[{
"productID": 776,
"categories": [
35
],
"name": "",
"priority": 3,
......
"status": 2,
"documents": [
{
"documentID": 74,
"productID": 776,
"name": null,
....
"isDefault": true
}
],
"productInfoGroups": [
{
"productInfoGroupID": 1575,
"productID": 776,
.....
"productInfos": [
{
"productInfoID": 2707,
"productInfoGroupID": 1575,
"title": "",
...
},
{
"productInfoID": 2708,
"productInfoGroupID": 1575,
...
},
{
"productInfoID": 2709,
.....
}
]
}
],
"lastUpdateDate": 130644319676570000,
"isActive": true
},....]
这里有一个解决方案,但它不适用于大型对象。我只需要更改类别数组和其他反序列化必须在默认情况下进行gson反序列化。
您必须为每个不同于JSON表示的变量指定自定义类型适配器。所有其他对象都自动处理。在您的情况下,它只是类别
变量,因为其余变量应该自动映射。
JSON:
[
{ "name" : "Foo",
"ints" : [1, 2, 3]
},
{ "name" : "Bar",
"ints" : []
}
]
模型类:
public class RealmInt extends RealmObject {
private int val;
public RealmInt() {
}
public RealmInt(int val) {
this.val = val;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
}
public class Product extends RealmObject {
private String name;
private RealmList<RealmInt> ints;
// Getters and setters
}
GSON配置:
Gson gson = 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;
}
})
.registerTypeAdapter(new TypeToken<RealmList<RealmInt>>() {}.getType(), new TypeAdapter<RealmList<RealmInt>>() {
@Override
public void write(JsonWriter out, RealmList<RealmInt> value) throws IOException {
// Ignore
}
@Override
public RealmList<RealmInt> read(JsonReader in) throws IOException {
RealmList<RealmInt> list = new RealmList<RealmInt>();
in.beginArray();
while (in.hasNext()) {
list.add(new RealmInt(in.nextInt()));
}
in.endArray();
return list;
}
})
.create();
JsonElement json = new JsonParser().parse(new InputStreamReader(stream));
List<Product> cities = gson.fromJson(json, new TypeToken<List<Product>>(){}.getType());
如果您有多个包装变量,如RealmInt,您需要为每个变量定义一个TypeAdapter。还要注意,上面的TypeAdapter期望总是遇到一个数组。如果你JSON可能会发送null
而不是[]
,你将需要在TypeAdapter中进行额外的检查。
我的目标是让这个电话“只是工作”。
问题内容: 我想编写一个通用函数,使用Gson反序列化通用类型List,下面是代码: 但是这段代码不起作用,我得到一个奇怪的结构,但是没有我的类型列表 当我使用时: 我工作,我得到了! 但是我需要一个通用函数,我该如何解决? 问候rubiktubik 问题答案: 没有将(as )的实际类型传递给您的方法,就无法做到这一点。 但是,如果显式传递它,则可以按如下所示创建for : 也可以看看:
问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪兽。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,在“ fromJson”行中
问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson
问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完
我想通过Google Gson传输一个列表对象,但我不知道如何反序列化泛型类型。 我在看了这个之后尝试了什么(Balusc的回答): 编辑: 现在我有 但是,我确实在“FromJson”行得到以下异常: null