У меня есть массив JSON, который мне нужно сохранить. Я думал о его сериализации, но было бы лучше сохранить его как строку в SharedPreferences, а затем перестроить его, когда мне нужно его прочитать?
Можно ли сохранить массив JSON в SharedPreferences?
Ответ 1
Объект JSON в Java не реализует serialaizable из коробки. Я видел, как другие расширяют класс, чтобы это разрешить, но для вашей ситуации я просто рекомендовал бы хранить объект 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) JSONObject jsonData = new JSONObject(strJson);
http://developer.android.com/reference/org/json/JSONObject.html#JSONObject(java.lang.String)
Ответ 2
Это зависит от того, насколько велик массив. Предполагая, что это не смехотворно большой (менее нескольких сотен Кб), просто сохраните его в общих предпочтениях. Если он больше этого, вы можете сохранить его в файл.
Ответ 3
Сохранить JSON напрямую. Посмотрите на это так: вы инкапсулируете представление данных. Если вы сериализовали определенный формат объекта, вы застряли бы с этим форматом объекта или должны были бы иметь дело с возможными изменениями этого объекта и в будущем беспокоиться о том, чтобы обновить его от старого формата сериализации до нового. Сохраняя его как JSON, вы можете раздуть его, как хотите.
Ответ 4
для сохранения массива 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()
Ответ 5
Я сделал то же самое... сериализую объект в строку json и сохраняю его в общих привилегиях. нет проблем, но поймите, что в конечном итоге prefs являются XML файлом, поэтому, если вы много читаете/пишете, он не будет работать хорошо.
Ответ 6
Да. Значения, сохраненные в SharedPreferences, должны быть примитивами или строками. Какую форму примет сериализованный объект JSON, если не примитив или String (или Set)? JSON - это сериализованный формат данных. Используйте его, если это то, что у вас уже есть.