¿Está bien guardar una matriz JSON en SharedPreferences?

Tengo una matriz JSON que necesito guardar. Estaba pensando en serializarlo, pero ¿sería mejor guardarlo como una cadena en SharedPreferences y luego reconstruirlo cuando necesite leerlo?

El objeto JSON en Java no implementa serialaizable fuera de la caja. He visto a otros extender la clase para permitir eso, pero para su situación simplemente recomendaría almacenar el objeto JSON como una cadena y usar su función toString (). He tenido éxito con esto.

editor.putString("jsondata", jobj.toString()); 

Y para recuperarlo:

 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)

Depende de qué tan grande sea la matriz. Suponiendo que no es ridículamente grande (menos de unos cientos de Kb), simplemente guárdela en las preferencias compartidas. Si es más grande que eso, puede guardarlo en un archivo.

para guardar la matriz json en preferencias compartidas, puede usar el método en clase de la siguiente manera

 public class CompanyDetails { @SerializedName("id") private String companyId; public String getCompanyId() { return companyId; } } 

en la clase de preferencia compartida

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

para llamar valor

  private CompanyDetails companyDetails; companyDetails = shared_class.getCompanyDetailsSharedPref(mContext); companyDetails.getCompanyId() 

Guarde el JSON directamente. Mírelo de esta manera: está encapsulando la representación de datos. Si serializó un formato de objeto específico, se quedaría bloqueado con ese formato de objeto o tendría que lidiar con los posibles cambios en ese objeto y se preocuparía por la actualización de un formato de serialización antiguo a uno nuevo en el futuro. Al guardarlo como JSON, puedes inflarlo como lo desees.

He hecho lo mismo … serializar un objeto a una cadena json y guardarlo en preferencias compartidas. No hay problema, pero comprenda que, en última instancia, los prefs son un archivo XML, por lo que si lo lee / escribe mucho, no funcionará bien.

Sí. Los valores guardados con SharedPreferences deben ser primitivos o Strings. ¿Qué forma tomaría el objeto JSON serializado si no es primitivo o Cadena (o Conjunto)? JSON es un formato de datos serializado. Úselo, si eso es lo que ya tiene.

Hice la misma tarea pero no uso gson.

  SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putString(app.KEY, String.valueOf(jsonArray)); editor.putBoolean(app.LOGGEDIN_SHARED_PREF,true); editor.commit(); 

De esta manera, guardé toda la respuesta json en las preferencias compartidas, la respuesta json tiene identificación, nombre, dirección, teléfono … etc. ahora si quiero obtener solo el nombre de las preferencias, ¿cómo puedo hacer eso … puede alguien por favor dígame