J'ai un tableau JSON que je dois enregistrer. Je pensais à la sérialiser, mais serait-il préférable de simplement l'enregistrer en tant que chaîne dans SharedPreferences, puis de le reconstruire lorsque j'ai besoin de le lire?
L’objet JSON en Java n’implémente pas immédiatement la possibilité d’être sérialisée. J'ai vu d'autres personnes étendre la classe pour permettre cela, mais dans votre cas, je recommanderais simplement de stocker l'objet JSON en tant que chaîne et d'utiliser sa fonction toString (). J'ai eu du succès avec ça.
editor.putString("jsondata", jobj.toString());
Et pour le récupérer:
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)
Cela dépend de la taille du tableau. En supposant que ce ne soit pas ridiculement grand (moins de quelques centaines de Ko), stockez-le dans des préférences partagées. S'il est plus gros que cela, vous pouvez l'enregistrer dans un fichier.
pour enregistrer tableau json en préférence partagée, vous pouvez utiliser la méthode en classe comme suit
public class CompanyDetails {
@SerializedName("id")
private String companyId;
public String getCompanyId() {
return companyId;
}
}
en classe de préférence partagée
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;
}
appeler la valeur
private CompanyDetails companyDetails;
companyDetails = shared_class.getCompanyDetailsSharedPref(mContext);
companyDetails.getCompanyId()
Enregistrez le JSON directement. Regardez les choses de cette façon: vous encapsulez la représentation des données. Si vous avez sérialisé un format d'objet spécifique, vous seriez bloqué avec ce format d'objet ou devrez gérer des modifications éventuelles de cet objet et vous inquiétez de la mise à niveau d'un ancien format de sérialisation vers un nouveau. En le sauvegardant en JSON, vous pouvez le gonfler comme vous le souhaitez.
J'ai fait la même chose ... sérialiser un objet sur une chaîne JSON et l'enregistrer dans les préférences partagées. Pas de problème, mais comprenez qu'au final, les préférences sont un fichier XML. Par conséquent, si vous lisez/écrivez souvent, il ne fonctionnera pas bien.
Oui. Les valeurs enregistrées avec SharedPreferences doivent être des primitives ou des chaînes. Quelle forme prendrait l'objet JSON sérialisé s'il n'était pas primitif ou String (ou Set)? JSON est un format de données sérialisé. Utilisez-le, si c'est ce que vous avez déjà.
Oui, vous pouvez économiser.
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);
}
Un autre moyen facile de sauvegarder JsonArray dans 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;
}
Il suffit d'appeler ce code pour obtenir votre 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) {
}