Gson将List <string>反序列化为realmList <realmstring> </realmstring> </string>

时间:2015-02-26 01:38:25

标签: java android gson realm

我正在使用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 有更好的选择吗?

3 个答案:

答案 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序列化器和反序列化器