¿Cómo puedo serializar un RealmObject a JSON en Realm for Java?

Estoy implementando un DB para mi aplicación y estoy intentando "conectarlo" a mi interfaz REST. Los datos vienen en JSON y con el nuevo JSON-Support (como del Reino 0.76) puedo lanzar el JSON en mi Realm.createObjectFromJson(MyType.class, jsonString) y crea los obejcts apropiados y RealmLists.

Pero ¿cómo puedo hacer lo contrario? Es decir, tomar un RealmObject y serializar a JSON? También debe serializar cualquier RealmList dentro de ese objeto.

Cristiano de Reino aquí. Realm para Android actualmente no tiene ninguno de estos métodos, aunque la base de datos en realidad es compatible con la serialización JSON, por lo que ahora tendría que hacerlo manualmente o utilizar una herramienta de terceros como GSON (advertencia, no he probado ese escenario todavía).

Para deserializar JSON en el uso de RealmObject de los siguientes

Digamos que tienes una definición de clase como esta

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

Y una carga json como esta:

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

Sin embargo, el reverso no es apoyado nativamente en el reino-núcleo. Así que esto es cómo trabajo alrededor de él. Intenté usar GSON , pero terminé escribiendo demasiados códigos que yo mismo no entendía, así que implementé mi propio adaptador como este. El problema es que RealmObjects no es 'realm' java.lang.Object .

Crear un adaptador que toma la instancia de su objeto de dominio y devolver su representación JSON.

ejemplo.

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

Ahora puede utilizar este adaptador en sus clases para serializar RealmObject a JSON . Prefferably usted haría el adaptador una interfaz de modo que usted deja a los llamadores (puede ser usted mismo) le pasan el adaptador el querer utilizar. Entonces puede llamar say, adapter.toJSON(realmObjectInstance) . Y obtener su aplicación JSONObject después de todo lo que le importa sólo el JSON y no el RealmObject.

NOTA Esta solución es un poco atrasada. RealmObjects ahora son objetos java reales por lo que debería ser capaz de utilizarlo con GSON sin problemas. Sólo asegúrese de que está utilizando la versión 0.89 o posterior y todo funcionará bien.

Simplemente, todo lo que necesitas hacer es:

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

A continuación se explica cómo hacerlo con la biblioteca GSON.

Supongamos que tenemos la siguiente respuesta json del servidor:

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

Para este objeto Json creamos una clase auxiliar con propiedades correspondientes

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

Ahora en el siguiente jsonReply es la cadena que contiene la respuesta del servidor

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

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

Prueba esto

  private JSONArray convertRealmintoJSONArray(Activity context){ try { RealmResults<ModelMyCart> results = RealmControllerMyCart.with(context).getBooks(); JSONArray jsonArray = new JSONArray(); for (ModelMyCart myCart : results ) { JSONObject object = new JSONObject(); object.put(Constants.PRODUCT_ID, myCart.getId()); object.put(Constants.PRODUCT_TITLE, myCart.getProduct_title()); object.put(Constants.PRODUCT_SIZE, myCart.getProduct_size()); object.put(Constants.PRODUCT_SELLINGFEE, myCart.getProduct_sellingfee()); object.put(Constants.PRODUCT_SELLINGFEE, myCart.getShipping_price()); object.put(Constants.PRODUCT_IMAGE, myCart.getProduct_image()); object.put(Constants.PRODUCT_BRAND, myCart.getProduct_brand()); object.put(Constants.PRODUCT_CATEGORY_ID, myCart.getProduct_category_id()); object.put(Constants.PRODUCT_CATEGORY_NAME, myCart.getProduct_category_name()); object.put(Constants.PRODUCT_COLOR, myCart.getProduct_color()); object.put(Constants.PRODUCT_COLORTYPE, myCart.getProduct_colortype()); object.put(Constants.PRODUCT_CONDITION, myCart.getProduct_condition()); object.put(Constants.PRODUCT_CREATED_DATE, myCart.getProduct_created_date()); object.put(Constants.PRODUCT_MYSALEPRICE, myCart.getProduct_mysaleprice()); object.put(Constants.PRODUCT_ORIGINALPRICE, myCart.getProduct_originalprice()); object.put(Constants.PRODUCT_POTENTIALEARNINGS, myCart.getProduct_potentialearnings()); object.put(Constants.PRODUCT_SHIPPINGCHARGES, myCart.getProduct_shippingcharges()); object.put(Constants.USER_ID, myCart.getUser_id()); object.put(Constants.USER_UNAME, myCart.getUser_uname()); jsonArray.put(object); } Log.e("Converted",""+jsonArray); return jsonArray; }catch (Exception e){ } return null; } 
  • Java.lang.RuntimeException: Paralleable encontró IOException escribiendo objeto serializable en Android que pasa el objeto ArrayList
  • Proguard mantener a los miembros de la clase
  • Leer / escribir un objeto en un archivo
  • Escribir XML en Android
  • Serialización de objetos para una nueva actividad
  • Cómo pasar el objeto serializado gson a Intent en android?
  • Restlet en Android - Problemas con la serialización
  • ¿Puedo utilizar serialización con ofuscación?
  • ¿La aplicación de Android restablece el cambio de orientación, la mejor manera de manejar?
  • ¿Cómo arreglar Unmarshalling código de tipo desconocido XXX en el desplazamiento YYY en Android?
  • ¿Cómo puedo inyectar un objeto en Android Priority Job Queue con Dagger 2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.