我有一个需要保存的JSON数组。我正在考虑对它进行序列化,但最好是将它作为字符串保存在SharedPreferences中,然后在我需要读取它时重新构建它?
答案 0 :(得分:64)
Java中的JSON对象没有实现可开箱即用的可串行化。我已经看到其他人扩展了类以允许它,但是对于你的情况,我只是建议将JSON对象存储为字符串并使用其toString()函数。我在这方面取得了成功。
editor.putString("jsondata", jobj.toString());
并将其取回:
String strJson = sharedPref.getString("jsondata","0");//second parameter is necessary ie.,Value to return if this preference does not exist.
if (strJson != null) {
try {
JSONObject response = new JSONObject(strJson);
} catch (JSONException e) {
}
}
http://developer.android.com/reference/org/json/JSONObject.html#JSONObject(java.lang.String)
答案 1 :(得分:4)
这取决于数组的大小。假设它不是很大(小于几百Kb),只需将它存储到共享首选项。如果它大于那个,你可以将它保存到文件中。
答案 2 :(得分:2)
要以共享首选项保存json数组,您可以使用类中的方法,如下所示
public class CompanyDetails {
@SerializedName("id")
private String companyId;
public String getCompanyId() {
return companyId;
}
}
在共享偏好类
中public static final String SHARED_PREF_NAME = "DOC";
public static final String COMPANY_DETAILS_STRING = "COMPANY_DETAIL";
public static final String USER_DETAILS_STRING = "USER_DETAIL";
public static void saveCompanyDetailsSharedPref(Context mContext, CompanyDetails companyDetails){
SharedPreferences mPrefs = mContext.getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(companyDetails);
prefsEditor.putString(COMPANY_DETAILS_STRING, json);
prefsEditor.commit();
}
public static CompanyDetails getCompanyDetailsSharedPref(Context mContext){
SharedPreferences mPrefs = mContext.getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = mPrefs.getString(COMPANY_DETAILS_STRING, "");
if(json.equalsIgnoreCase("")){
return null;
}
CompanyDetails obj = gson.fromJson(json, CompanyDetails.class);
return obj;
}
调用值
private CompanyDetails companyDetails;
companyDetails = shared_class.getCompanyDetailsSharedPref(mContext);
companyDetails.getCompanyId()
答案 3 :(得分:1)
我做了同样的事情......将一个objet序列化为一个json字符串并将其保存到共享的prefs中。没问题,但要明白最终prefs是一个XML文件,所以如果你正在阅读/写它很多,它就不会很好。
答案 4 :(得分:1)
直接保存JSON。以这种方式看待它:你正在封装数据表示。如果您序列化了特定的对象格式,那么您将无法使用该对象格式,或者必须处理对该对象的可能更改,并担心将来从旧的序列化格式升级到新的序列化格式。将它作为JSON保存,你可以根据需要给它充气。
答案 5 :(得分:0)
是。使用SharedPreferences保存的值必须是基元或字符串。如果不是原始的或字符串(或Set),序列化的JSON对象将采用什么形式? JSON是一种序列化数据格式。使用它,如果这是你已经得到的。
答案 6 :(得分:0)
将JsonArray保存到共享首选项的另一种简便方法:
public void SaveFriendList(String key, JSONArray value) {
FriendLst = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = FriendLst.edit();
editor.putString(key, value.toString());
editor.commit();
}
public String LoadFriendList() {
MyApplication.FriendLst = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String FriendLsts = MyApplication.FriendLst.getString("Friends", "");
return FriendLsts;
}
只需调用此代码即可获得您的Json:-)
try {
JSONArray jarry1 = new JSONArray(LoadFriendList());
JSONObject jobject;
datamodelfriends.clear();
for (int i = 0; i < jarry1.length(); i++) {
jobject = jarry1.getJSONObject(i);
String FirstName = jobject.get("FirstName").toString();//You can get your own objects like this
datamodelfriends.add(new DataModelFriends(FirstName,...));
}
mAdapter = new CustomeAdapterFriendList(datamodelfriends, MainActivity.this);
RecyclerView_Friends.setAdapter(mAdapter);
} catch (Exception e) {
}
答案 7 :(得分:0)
是的,您可以保存。
combiner
答案 8 :(得分:0)
这是使用Kotlin存储User类的简单版本:
class PreferenceHelper(context: Context) {
companion object {
private const val prefsFileName = "com.example.prefs"
private const val userConst = "user"
}
private val prefs: SharedPreferences = context.getSharedPreferences(prefsFileName, MODE_PRIVATE)
var user: User?
get() = GsonBuilder().create().fromJson(prefs.getString(userConst, null), User::class.java)
set(value) = prefs.edit().putString(userConst, GsonBuilder().create().toJson(value)).apply()
}