web-dev-qa-db-ja.com

Realm for JavaでRealmObjectをJSONにシリアル化するにはどうすればよいですか?

アプリケーションにDBを実装していて、それをRESTインターフェイスに「接続」しようとしています。データはJSONとして、新しいJSONサポート(レルム0.76以降)で提供されます。私のRealm.createObjectFromJson(MyType.class, jsonString)でJSONをスローでき、適切なオブジェクトとRealmListsを作成します。

しかし、どうすれば反対のことができますか?つまり、RealmObjectを取得してJSONにシリアル化しますか?また、そのオブジェクト内のRealmListをシリアル化する必要があります。

9
degill

ここレルムのクリスチャン。 Realm for Androidは現在、そのようなメソッドを持っていませんが、コアデータベースは実際にはJSONシリアル化をサポートしているため、今のところ、手動​​で行うか、GSONなどのサードパーティツールを使用する必要があります(警告、私はまだそのシナリオをテストしていません)。

5

簡単に言うと、あなたがする必要があるのは:

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

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

そしてこのような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);
_

ただし、その逆はレルムコアではネイティブにサポートされていません。だからこれは私がそれを回避する方法です。 [〜#〜] gson [〜#〜]を使おうとしましたが、コードが多すぎて自分では理解できなかったので、このように独自のアダプターを実装しました。問題はRealmObjectsが'レルム' _Java.lang.Object_ではありません。

レルムオブジェクトのインスタンスを取得し、そのJSON表現を返すadapterを作成します。

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

これで、クラスでこのアダプターを使用して、RealmObject[〜#〜] json [〜#〜]にシリアル化できます。できれば、アダプターをインターフェースにして、呼び出し元(自分自身かもしれません)が使用したいアダプターを渡せるようにします。次に、たとえばadapter.toJSON(realmObjectInstance)を呼び出すことができます。そして、RealmObjectではなくJSONだけを気にするので、JSONObjectの実装を取得します。

[〜#〜] note [〜#〜]この解決策は少し時代遅れです。 RealmObjectsが実際のJavaオブジェクトになっているため、GSONで問題なく使用できるはずです。バージョン0.89以降を使用していることを確認してください。すべてが正常に機能します。

7

以下は、GSONライブラリを使用してそれを行う方法です。

サーバーから次のjson応答があるとします。

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

このJsonオブジェクトに対して、対応するプロパティを持つヘルパークラスを作成します

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

次のjsonReplyには、サーバーからの応答を含む文字列があります。

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

そしてレルムデータオブジェクト

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


}
1
J.Vassallo

これを試して

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