Skip to content

Instantly share code, notes, and snippets.

@jplazcano87
Forked from cmelchior/ SerializeToJson.java
Created April 18, 2017 15:50
Show Gist options
  • Save jplazcano87/7f29a179f5ff719f2ee0cfd8fcf566bf to your computer and use it in GitHub Desktop.
Save jplazcano87/7f29a179f5ff719f2ee0cfd8fcf566bf to your computer and use it in GitHub Desktop.
Serialize Realm objects to JSON using GSON
// GSON can parse the data.
//
// Deserialization:
// Note there is a bug in GSON 2.3.1 that can cause it to StackOverflow when working with RealmObjects.
// To work around this, use the ExclusionStrategy below or downgrade to 1.7.1
// See more here: https://code.google.com/p/google-gson/issues/detail?id=440
//
// Serialization:
// <Type>RealmProxy objects are created by the Realm annotation processor. They are used to control
// access to the actual data instead of storing them in fields and it is therefore them we need to register a
// TypeAdapter for.
Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
})
.registerTypeAdapter(Class.forName("io.realm.PersonRealmProxy"), new PersonSerializer())
.registerTypeAdapter(Class.forName("io.realm.DogRealmProxy"), new DogSerializer())
.create();
// Serialize a Realm object to a JSON string
String json = gson.toJson(realm.where(Person.class).findFirst());
package io.realm.example;
import io.realm.RealmObject;
public class Dog extends RealmObject {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package io.realm.examples;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import io.realm.examples.realmgridview.Dog;
public class DogSerializer implements JsonSerializer<Dog> {
@Override
public JsonElement serialize(Dog src, Type typeOfSrc, JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", src.getName());
return jsonObject;
}
}
package io.realm.example;
import io.realm.RealmList;
import io.realm.RealmObject;
public class Person extends RealmObject {
private String name;
private int age;
private Dog favoriteDog;
private RealmList<Dog> dogs;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog getFavoriteDog() {
return favoriteDog;
}
public void setFavoriteDog(Dog favoriteDog) {
this.favoriteDog = favoriteDog;
}
public RealmList<Dog> getDogs() {
return dogs;
}
public void setDogs(RealmList<Dog> dogs) {
this.dogs = dogs;
}
}
package io.realm.example;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
public class PersonSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person src, Type typeOfSrc, JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", src.getName());
jsonObject.addProperty("age", src.getAge());
jsonObject.add("favoriteDog", context.serialize(src.getFavoriteDog()));
jsonObject.add("dogs", context.serialize(src.getDogs()));
return jsonObject;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment