【问题标题】:Is it ok to save a JSON array in SharedPreferences?可以在 SharedPreferences 中保存 JSON 数组吗?
【发布时间】:2011-08-20 13:44:41
【问题描述】:

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

【问题讨论】:

  • 一个 JSON 数组已经序列化了,你到底是什么意思?
  • 我想把它保存到一个文件中,这样我以后可以再次阅读它。我的替代方法是将它放在 SharedPreferences 中。

标签: java android json serialization sharedpreferences


【解决方案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)

【讨论】:

  • 谢谢 那么如何将其转换回 JSONArray?我可以看到一个 toJSONArray(names) 方法,但它需要名称或键值参数:s
  • 这不是最高效的做法,因为会有双重解析。一次将数组转换为 JSON,另一次将 JSON 转换为 XML。如果这是在诸如从主线程之类的关键路径中完成的,则可能会导致性能问题。
【解决方案2】:

这取决于数组有多大。假设它不是大得离谱(小于几百 Kb),只需将其存储到共享首选项中。如果大于此值,您可以将其保存到文件中。

【讨论】:

  • 我有一个包含 40 个项目的 Json 数组,每个项目都有 5 或 6 个属性,使用 Sharedpreferences 是个好主意吗?
【解决方案3】:

要将 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()

【讨论】:

  • 您将 JsonArray 保存在 SharedPreference 中的什么位置?
  • 正如你在代码中看到的那样,存储的字符串是 json 的形式,所以如果你现在想从共享首选项中获取 json,你可以很容易地得到它,你可以用你的方式修改它,我只是说进入 pojo 以简化,感谢反馈
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    直接将 JSON 保存出来。以这种方式看待它:您正在封装数据表示。如果您序列化了特定的对象格式,您将被该对象格式卡住,或者必须处理对该对象的可能更改,并担心将来从旧的序列化格式升级到新的序列化格式。将其保存为 JSON,您可以根据需要对其进行扩展。

    【讨论】:

      【解决方案6】:

      是的,您可以保存。

       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);
      
          }
      

      【讨论】:

        【解决方案7】:

        这是一个使用 Kotlin 存储用户类的简单版本:

        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()
        
        }
        

        【讨论】:

          【解决方案8】:

          是的。使用 SharedPreferences 保存的值必须是原语或字符串。如果不是原始的或字符串(或集合),序列化的 JSON 对象将采用什么形式? JSON 是一种序列化的数据格式。使用它,如果那是你已经拥有的。

          【讨论】:

            【解决方案9】:

            另一种将 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) {
                                        }
            

            【讨论】:

              猜你喜欢
              • 2019-09-23
              • 2017-04-25
              • 1970-01-01
              • 2022-12-09
              • 2016-05-27
              • 1970-01-01
              • 1970-01-01
              • 2013-11-02
              • 1970-01-01
              相关资源
              最近更新 更多