有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在SharedReferences中保存JSON数组可以吗?

我需要保存一个JSON数组。我正在考虑序列化它,但是如果在SharedReferences中将其保存为字符串,然后在需要读取时重新生成它,会更好吗


共 (6) 个答案

  1. # 1 楼答案

    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)

  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. # 3 楼答案

    直接保存JSON。这样看:您正在封装数据表示。如果你序列化了一个特定的对象格式,你将不得不使用该对象格式,或者必须处理该对象可能发生的更改,并担心将来从旧的序列化格式升级到新的序列化格式。把它保存为JSON,你可以随心所欲地膨胀

  4. # 4 楼答案

    这取决于阵列的大小。假设它不是非常大(小于几百Kb),只需将其存储到共享首选项中即可。如果比这个大,你可以把它保存到一个文件中

  5. # 5 楼答案

    是的,你可以省钱

     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);
    
        }
    
  6. # 6 楼答案

    我也做了同样的事。。。将objet序列化为json字符串,并将其保存到共享pref中。没问题,但要明白prefs最终是一个XML文件,所以如果你经常读/写它,它的性能就不会很好