web-dev-qa-db-fra.com

Est-il possible d'enregistrer un tableau JSON dans SharedPreferences?

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?

29
Sheehan Alam

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)

64
sgarman

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.

4
Falmarri

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()
2
Mahesh Pandit

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.

1
Brian Dupuis

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. 

1

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à.

0
Thane Anthem

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

    }
0
Rajneesh Shukla

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) {
                            }
0