Подтвердить что ты не робот

Можно ли сохранить массив JSON в SharedPreferences?

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

4b9b3361

Ответ 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 - это сериализованный формат данных. Используйте его, если это то, что у вас уже есть.