可以在SharedPreferences中保存JSON数组吗?

时间:2011-05-07 00:30:20

标签: java android json serialization sharedpreferences

我有一个需要保存的JSON数组。我正在考虑对它进行序列化,但最好是将它作为字符串保存在SharedPreferences中,然后在我需要读取它时重新构建它?

9 个答案:

答案 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()

}