[英]Is it ok to save a JSON array in SharedPreferences?
我有一個需要保存的 JSON 數組。 我正在考慮序列化它,但是將它保存為 SharedPreferences 中的字符串,然后在需要讀取它時重建它會更好嗎?
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)
這取決於數組有多大。 假設它不是大得離譜(小於幾百 Kb),只需將其存儲到共享首選項即可。 如果它大於那個,你可以把它保存到一個文件中。
要將 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()
我做了同樣的事情……將對象序列化為 json 字符串並將其保存到共享首選項中。 沒問題,但要明白,首選項最終是一個 XML 文件,所以如果你經常讀/寫它,它的性能不會很好。
直接將 JSON 保存出來。 這樣看:您正在封裝數據表示。 如果您序列化了特定的對象格式,您將被該對象格式困住,或者必須處理對該對象可能發生的更改,並擔心將來從舊的序列化格式升級到新的序列化格式。 將其保存為 JSON,您可以根據需要對其進行膨脹。
這是一個使用 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()
}
另一種將 JsonArray 保存到 Sharedprefrences 的簡單方法:
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) {
}
是的,您可以保存。
public void saveData(View view) {
User user = new User(1, "Rajneesh", "hi this is rajneesh shukla");
userList.add(user);
SharedPreferences preferences = getSharedPreferences("DATA" , MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
Gson gson = new Gson();
String s = gson.toJson(userList);
editor.putString("USER_DATA", s);
editor.apply();
}
public void logData(View view) {
SharedPreferences preferences = getSharedPreferences("DATA", MODE_PRIVATE);
String s = preferences.getString("USER_DATA", "Data is not saved" );
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<User>>(){} .getType();
ArrayList<User> mUser = gson.fromJson(s, type);
}
是的。 使用 SharedPreferences 保存的值必須是原語或字符串。 如果不是原始或字符串(或集合),序列化的 JSON 對象將采用什么形式? JSON 是一種序列化數據格式。 使用它,如果那是您已經擁有的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.