Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I serialize a RealmObject to JSON in Realm for Java?

I am implementing a DB for my Application and I am trying "connect" it to my REST interface. The data comes in as JSON and with the new JSON-Support (as of Realm 0.76) I can throw the JSON at my Realm.createObjectFromJson(MyType.class, jsonString) and it creates the appropiate obejcts and RealmLists.

But how can I do the opposite? That is, take a RealmObject and serialize it to JSON? It also should serialize any RealmList inside that object.

like image 291
degill Avatar asked Jan 12 '15 13:01

degill


4 Answers

Christian from Realm here. Realm for Android currently doesn't have any such methods, although the core database actually supports JSON serialisation, so for now you would either have to do it manually or use a 3rd party tool like GSON (caveat, I havn't tested that scenario yet).

like image 89
Christian Melchior Avatar answered Nov 04 '22 01:11

Christian Melchior


Simply, all you need to do is:

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);
}
like image 23
EpicPandaForce Avatar answered Nov 04 '22 01:11

EpicPandaForce


to deserialize JSON into RealmObject use on of the following

say you have a class definition like this

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

and a json payload like this:

 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);

However the reverse is not natively supported in realm-core. so this is how i work around it. i attempted to use GSON, but ended up writing too many codes that i myself did not understand so i implemented my own adapter like this.The problem is RealmObjects are not 'realm' java.lang.Object.

create an adapter that takes instance of your realm object and return its JSON representation.

example.

 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;
     }
   }

you can now use this adapter in your classes to serialize you RealmObject to JSON. prefferably you would make the adapter an interface so that you let callers (might be you yourself) pass you the adapter the want to use. you can then call say, adapter.toJSON(realmObjectInstance). and get your JSONObject implementation after all you care only about the JSON and not the RealmObject.

NOTE This solution is a bit oudated. RealmObjects are now real java objects so you should be able to use it with GSON with no problems. Just make sure you are using version 0.89 or later and everything will work fine.

like image 42
The-null-Pointer- Avatar answered Nov 04 '22 00:11

The-null-Pointer-


Following is how you would do that with GSON library.

Suppose we have the following json reply from the server :

{
   "data": [
      {
         "id": "1",
         "name": "John",
         "surname": "Doe"
      }
   ]
}

For this Json object we create a helper class with corresponding properties

    public class JsonHelperClass {

    String id;
    String name;
    String surname;

    public JsonHelperClass() {
    }

    public JsonHelperClass(String id, String name, String surname) {
        this.id = id;
        this.name = name;
        this.surname = surname;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
}

Now in the following jsonReply is the string containing reply from server

    JSONArray jsonArray = new HttpManager().getJsonArrayFromReply(jsonReply);

    if(jsonArray == null || jsonArray.length <0){
        return;
    }

    for (int i = 0; i < jsonArray.length(); i++) {

        JSONObject json = null;
        try {
        json = (JSONObject) array.get(i);
        } catch (JSONException e) {
        return null;
        }

        Gson gson = new Gson();

        JsonHelperClass helperClass = gson.fromJson(json.toString(), JsonHelperClass.class);

        createRealmObject(helperClass);

}


    public void createRealmObject(JsonHelperClass helperClass){

        Realm realm = Realm.getInstance(context);

        realm.beginTransaction();

        RealmDataObject obj = realm.createObject(RealmDataObject.class);

        obj.setId(helperClass.getId());
        obj.setName(helperClass.getName());
        obj.setSurname(helperClass.getSurname());

        realm.commitTransaction();


}

     public JSONArray getJsonArrayFromReply(String reply){

        JSONArray array = null;

        try {
            JSONObject jsonResp = new JSONObject(reply);
            array = jsonResp.getJSONArray("data");

        } catch (JSONException e) {
            return null;
        }

        return array;
    }

And the Realm Data Object

    public class RealmDataObject extends RealmObject {

    private String id;
    private String name;
    private String surname;

    public RealmDataObject() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }


}
like image 1
J.Vassallo Avatar answered Nov 03 '22 23:11

J.Vassallo