Можно ли сохранить массив JSON в SharedPreferences? - PullRequest
29 голосов
/ 07 мая 2011

У меня есть JSON Array, который мне нужно сохранить. Я думал о сериализации, но было бы лучше просто сохранить его как строку в SharedPreferences, а затем перестроить, когда мне нужно будет прочитать его?

Ответы [ 8 ]

64 голосов
/ 07 мая 2011

JSON-объект в Java не поддерживает сериализацию из коробки. Я видел, как другие расширяют класс, чтобы позволить это, но для вашей ситуации я бы просто рекомендовал хранить объект 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)

4 голосов
/ 07 мая 2011

Это зависит от размера массива. Предполагая, что он не слишком большой (менее нескольких сотен килобайт), просто сохраните его для общих настроек. Если оно больше, вы можете сохранить его в файл.

2 голосов
/ 10 сентября 2017

для сохранения массива 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()
1 голос
/ 07 мая 2011

Сохраните JSON напрямую. Посмотрите на это так: вы инкапсулируете представление данных. Если вы сериализовали определенный формат объекта, вы застряли бы с этим форматом объекта или вам пришлось бы иметь дело с возможными изменениями этого объекта и беспокоиться об обновлении старого формата сериализации на новый в будущем. Сохраняя это как JSON, вы можете надуть его так, как пожелаете.

1 голос
/ 07 мая 2011

Я сделал то же самое ... сериализовал объект в строку json и сохранил его в общих префиксах. Нет проблем, но поймите, что в конечном итоге префы - это файл XML, поэтому, если вы много читаете / пишете, он не будет работать хорошо.

0 голосов
/ 31 октября 2018

Да, Вы можете сохранить.

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

    }
0 голосов
/ 24 октября 2018

Еще один простой способ сохранить 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) {
                            }
0 голосов
/ 07 мая 2011

Да.Значения, сохраненные с помощью SharedPreferences, должны быть примитивами или строками.Какую форму примет сериализованный объект JSON, если не примитив или String (или Set)?JSON - это сериализованный формат данных.Используйте его, если это то, что вы уже получили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...