我正在使用gson进行改造,将我的json反序列化为领域对象。这在大多数情况下都非常有效。处理
时出现问题RealmList(String(或任何其他基本数据类型))
由于Realm不支持RealmList,其中E不扩展Realm对象,我将String包装在RealmObject中。
public class RealmString extends RealmObject {
private String val;
public String getValue() {
return val;
}
public void setValue(String value) {
this.val = value;
}
}
我的领域对象如下
public class RealmPerson extends RealmObject {
@PrimaryKey
private String userId;
...
private RealmList<RealmString> stringStuff;
private RealmList<SimpleRealmObj> otherStuff;
<setters and getters>
}
SimpleRealmObj工作正常,因为它只有String元素
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:期望一个字符串但在第1行第3列路径中是NAME $
我之前试过RealmList,RealmString适配器无济于事。 到目前为止我找到的唯一解决方法是https://github.com/realm/realm-java/issues/620#issuecomment-66640786 有更好的选择吗?
答案 0 :(得分:5)
错误消息&#34; Expected a string but was NAME
&#34;可以通过在实际的json对象(在你的情况下是JsonReader
)之前检索String
中的json对象的名称来解决。
您可以查看Android documentation for JsonReader。它有详细的解释和代码片段。您还可以查看文档中示例代码段中的readMessage
方法。
我已将read
方法修改为我认为应该是的方法。 注意:我没有测试代码,因此可能会出现一些小错误。
@Override
public RealmPerson read(JsonReader in) throws IOException {
RealmPerson rList = new RealmPerson();
in.beginObject();
String name = "";
while (in.hasNext()) {
name = in.nextName();
if (name.equals("userId")) {
String userId = in.nextString();
// update rList here
} else if (name.equals("otherStuff")) {
// since otherStuff is a RealmList of RealmStrings,
// your json data would be an array
// You would need to loop through the array to retrieve
// the json objects
in.beginArray();
while (in.hasNext()) {
// begin each object in the array
in.beginObject();
name = in.nextName();
// the RealmString object has just one property called "value"
// (according to the code snippet in your question)
if (name.equals("val")) {
String val = in.nextString();
// update rList here
} else {
in.skipValue();
}
in.endObject();
}
in.endArray();
} else {
in.skipValue();
}
}
in.endObject();
return rList;
}
如果有帮助,请告诉我。
答案 1 :(得分:4)
我的gson typeAdapter是罪魁祸首。 上面的错误被视为我没有正确地将json反序列化为RealmPerson,第一个字段不是字符串,因此
in.nextString()
是borking。
我查看了一些示例代码,它击中了我,我没有必要使用
in.beginObject()和in.endObject()
反序列化String。以下代码有效。
public class QLRealmStringAdapter extends TypeAdapter<QLRealmString> {
@Override
public void write(JsonWriter out, QLRealmString value) throws IOException {
Log.e("DBG " + value.getValue(), "");
out.value(value.getValue());
}
@Override
public RealmString read(JsonReader in) throws IOException {
RealmString rString = new RealmString();
if (in.hasNext()) {
String nextStr = in.nextString();
System.out.println("DBG " + nextStr);
rString.setValue(nextStr);
}
return rString;
}
}
希望这有助于某人。
答案 2 :(得分:0)
我需要一个用于将Arraylist转换为RealmList的jackson序列化器和反序列化器