簡體   English   中英

可以在 SharedPreferences 中保存 JSON 數組嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM