如何在 Realm for Java 中将 RealmObject 序列化为 JSON?
How can I serialize a RealmObject to JSON in Realm for Java?
我正在为我的应用程序实现一个数据库,我正在尝试 "connect" 它到我的 REST 接口。数据以 JSON 和新的 JSON-Support(从 Realm 0.76 开始)的形式出现,我可以将 JSON 扔到我的 Realm.createObjectFromJson(MyType.class, jsonString)
并创建适当的对象和领域列表。
但是我该如何反其道而行之呢?也就是拿一个RealmObject序列化成JSON?它还应该序列化该对象内的任何 RealmList。
这里是 Realm 的基督徒。
Android 的领域目前没有任何这样的方法,尽管核心数据库实际上支持 JSON 序列化,所以现在你要么必须手动完成,要么使用像 GSON 这样的第三方工具(警告,我还没有测试过那个场景。
以下是使用 GSON 库的方法。
假设我们有以下 json 来自服务器的回复:
{
"data": [
{
"id": "1",
"name": "John",
"surname": "Doe"
}
]
}
对于这个 Json 对象,我们创建了一个具有相应属性的助手 class
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;
}
}
将 JSON 反序列化为 RealmObject 使用以下
假设您有这样的 class 定义
@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);
然而,realm-core 本身不支持反向操作。所以这就是我解决它的方法。我尝试使用 GSON,但最终写了太多我自己不理解的代码,所以我实现了自己的适配器,例如 this.The 问题是 RealmObjects 不是 'realm' java.lang.Object
.
创建一个适配器,它采用您的领域对象的实例和return它的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;
}
}
您现在可以在 classes 中使用此适配器将您 RealmObject
序列化为
JSON。最好让适配器成为一个接口,这样你就可以让调用者(可能是你自己)将要使用的适配器传递给你。
然后你可以打电话说,adapter.toJSON(realmObjectInstance)
。并获取您的 JSONObject 实现
毕竟你只关心 JSON 而不是 RealmObject.
注意
这个解决方案有点过时了。 RealmObjects 现在是真实的 java 对象,因此您应该可以毫无问题地将它与 GSON 一起使用。只要确保您使用的是 0.89 或更高版本,一切都会正常工作。
很简单,您需要做的就是:
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);
}
试试这个
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;
}
对于我的情况 new Gson().toJson(realm.copy(realmObj));
导致 UI 冻结 (有时内存不足异常)。所以我像那样更新了我的 Gson 实例
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String jsonString = gson.toJson(realm.copy(realmObj));
我正在为我的应用程序实现一个数据库,我正在尝试 "connect" 它到我的 REST 接口。数据以 JSON 和新的 JSON-Support(从 Realm 0.76 开始)的形式出现,我可以将 JSON 扔到我的 Realm.createObjectFromJson(MyType.class, jsonString)
并创建适当的对象和领域列表。
但是我该如何反其道而行之呢?也就是拿一个RealmObject序列化成JSON?它还应该序列化该对象内的任何 RealmList。
这里是 Realm 的基督徒。 Android 的领域目前没有任何这样的方法,尽管核心数据库实际上支持 JSON 序列化,所以现在你要么必须手动完成,要么使用像 GSON 这样的第三方工具(警告,我还没有测试过那个场景。
以下是使用 GSON 库的方法。
假设我们有以下 json 来自服务器的回复:
{
"data": [
{
"id": "1",
"name": "John",
"surname": "Doe"
}
]
}
对于这个 Json 对象,我们创建了一个具有相应属性的助手 class
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;
}
}
将 JSON 反序列化为 RealmObject 使用以下
假设您有这样的 class 定义
@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);
然而,realm-core 本身不支持反向操作。所以这就是我解决它的方法。我尝试使用 GSON,但最终写了太多我自己不理解的代码,所以我实现了自己的适配器,例如 this.The 问题是 RealmObjects 不是 'realm' java.lang.Object
.
创建一个适配器,它采用您的领域对象的实例和return它的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;
}
}
您现在可以在 classes 中使用此适配器将您 RealmObject
序列化为
JSON。最好让适配器成为一个接口,这样你就可以让调用者(可能是你自己)将要使用的适配器传递给你。
然后你可以打电话说,adapter.toJSON(realmObjectInstance)
。并获取您的 JSONObject 实现
毕竟你只关心 JSON 而不是 RealmObject.
注意 这个解决方案有点过时了。 RealmObjects 现在是真实的 java 对象,因此您应该可以毫无问题地将它与 GSON 一起使用。只要确保您使用的是 0.89 或更高版本,一切都会正常工作。
很简单,您需要做的就是:
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);
}
试试这个
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;
}
对于我的情况 new Gson().toJson(realm.copy(realmObj));
导致 UI 冻结 (有时内存不足异常)。所以我像那样更新了我的 Gson 实例
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String jsonString = gson.toJson(realm.copy(realmObj));