gpt4 book ai didi

java - Gson 将 List 反序列化为 realmList

转载 作者:IT老高 更新时间:2023-10-28 20:21:52 26 4
gpt4 key购买 nike

我正在使用带有 gson 的改造来将我的 json 反序列化为 Realm 对象。这在大多数情况下都非常有效。处理时出现问题

RealmList(String(or any other basic data type))

由于 Realm 不支持 E 不扩展 Realm 对象的 RealmList,我将 String 包装在 RealmObject 中。

public class RealmString extends RealmObject {
private String val;

public String getValue() {
return val;
}

public void setValue(String value) {
this.val = value;
}
}

我的 Realm 对象如下

    public class RealmPerson extends RealmObject {
@PrimaryKey
private String userId;
...
private RealmList<RealmString> stringStuff;
private RealmList<SimpleRealmObj> otherStuff;

<setters and getters>
}

SimpleRealmObj 工作正常,因为它只有字符串元素

    public class SimpleRealmObj extends RealmObject {
private String foo;
private String bar;
...
}

如何反序列化 stringStuff?我尝试使用 gson TypeAdapter

public class RealmPersonAdapter extends TypeAdapter<RealmPerson> {
@Override
public void write(JsonWriter out, RealmPerson value) throws IOException {
out.beginObject();
Log.e("DBG " + value.getLastName(), "");
out.endObject();
}

@Override
public RealmPerson read(JsonReader in) throws IOException {
QLRealmPerson rList = new RealmPerson();
in.beginObject();
while (in.hasNext()) {
Log.e("DBG " + in.nextString(), "");
}
in.endObject();

return rList;
}

但是我还是遇到了 IllegalStateException

2334-2334/com.qualcomm.qlearn.app E//PersonService.java:71﹕ main com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was NAME at line 1 column 3 path $.

我之前尝试过RealmList,RealmString 适配器无济于事。到目前为止,我设法找到的唯一解决方法是 https://github.com/realm/realm-java/issues/620#issuecomment-66640786有更好的选择吗?

最佳答案

It is better 为您的 JsonSerializer 使用 JsonDeserializer TypeAdapter 而不是 RealmObject ,原因有两个:

  1. 它们允许您将 RealmObject 的(反)序列化委托(delegate)给默认的 Gson(反)序列化器,这意味着 您不需要自己编写样板

  2. a weird bug in Gson 2.3.1 在反序列化过程中可能会导致 StackOverflowError(我自己尝试了 TypeAdapter 的方法并遇到了这个错误)。

方法如下(将 Tag 替换为 RealmObject 类):

(注意下面的 context.serializecontext.deserialize 等价于 gson.toJsongson.fromJson ,这意味着我们不需要自己解析 Tag 类。)

RealmList<Tag> 的解析器 + 序列化器:

public class TagRealmListConverter implements JsonSerializer<RealmList<Tag>>,
JsonDeserializer<RealmList<Tag>> {

@Override
public JsonElement serialize(RealmList<Tag> src, Type typeOfSrc,
JsonSerializationContext context) {
JsonArray ja = new JsonArray();
for (Tag tag : src) {
ja.add(context.serialize(tag));
}
return ja;
}

@Override
public RealmList<Tag> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
RealmList<Tag> tags = new RealmList<>();
JsonArray ja = json.getAsJsonArray();
for (JsonElement je : ja) {
tags.add((Tag) context.deserialize(je, Tag.class));
}
return tags;
}

}

标签类:

@RealmClass
public class Tag extends RealmObject {
private String value;

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}

然后用 Gson 注册你的转换器类:

Gson gson = new GsonBuilder()
.registerTypeAdapter(new TypeToken<RealmList<Tag>>() {}.getType(),
new TagRealmListConverter())
.create();

关于java - Gson 将 List<String> 反序列化为 realmList<RealmString>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28733024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com