如何在Realm for Java中将RealmObject序列化为JSON?

deg*_*ill 9 serialization android json realm

我正在为我的应用程序实现一个数据库,我正在尝试将它"连接"到我的REST接口.数据以JSON形式出现,并且使用新的JSON-Support(从Realm 0.76开始)我可以将JSON抛给我Realm.createObjectFromJson(MyType.class, jsonString),它会创建适当的obejcts和RealmLists.

但我怎么能这样做呢?也就是说,使用RealmObject并将其序列化为JSON?它还应该序列化该对象内的任何RealmList.

Epi*_*rce 11

简而言之,您需要做的就是:

Gson gson = //... obtain your Gson
YourRealmObject realmObj = realm.where(YourRealmObject.class).findFirst();
if(realmObj != null) {
    realmObj = realm.copyFromRealm(realmObj); //detach from Realm, copy values to fields
    String json = gson.toJson(realmObj);
}
Run Code Online (Sandbox Code Playgroud)


The*_*er- 7

要将JSON反序列化为RealmObject,请使用以下内容

说你有这样的课程定义

 @RealmClass
 public class Foo extends RealmObject{
  private String name;
  public void setName(String name){ this.name = name}
  public String getName(){ return this.name}
} 
Run Code Online (Sandbox Code Playgroud)

和像这样的json有效负载:

 String json = "{\"name\":\"bar\"}";
 Foo fooObject= realm.createObjectFromJson(Foo.class, json);
 //or 
 String jsonArray = "[{\"name\":\"bar\"},{\"name\":\"baz\"}]";
 RealmList<Foo> fooObjects = realm.createAllFromJson(Foo.class, jsonArray);
Run Code Online (Sandbox Code Playgroud)

然而,在领域核心中本身不支持反向.所以这就是我如何解决它.我试图使用GSON,但最终编写了太多我自己不理解的代码,所以我实现了我自己的适配器.问题是RealmObjects不是'领域' java.lang.Object.

创建一个适配器,它接受你的领域对象的实例并返回它的JSON表示.

例.

 public class RealmJsonAdapter{
    public JSONObject toJson(Foo foo){
     JSONObject obj = new JSONObject();
     obj.putString("name",foo.getName());
     //if you have more fields you continue
     return obj;
     }
   }
Run Code Online (Sandbox Code Playgroud)

您现在可以使用该适配器在你的类序列化RealmObjectJSON.最好你会使适配器成为一个接口,这样你就可以让调用者(可能是你自己)通过你想要使用的适配器.你可以打电话说,adapter.toJSON(realmObjectInstance).在你只关心JSON而不是RealmObject之后获得你的JSONObject实现.

注意 这个解决方案有点啰嗦.RealmObjects现在是真正的java对象,所以你应该可以在没有问题的情况下将它与GSON一起使用.只需确保您使用的是0.89或更高版本,一切都会正常工作.


Chr*_*ior 5

来自Realm的基督徒。尽管核心数据库实际上支持JSON序列化,但Android Realm目前没有任何此类方法,因此,现在您必须手动执行此操作,或使用GSON之类的第三方工具(注意,我尚未测试该方案然而)。