wake-up-neo.net

Ist es in Ordnung, ein JSON-Array in SharedPreferences zu speichern?

Ich habe ein JSON-Array, das ich speichern muss. Ich habe darüber nachgedacht, es zu serialisieren, aber wäre es besser, es einfach als Zeichenfolge in SharedPreferences zu speichern und dann neu zu erstellen, wenn ich es einlesen muss?

29
Sheehan Alam

Das JSON-Objekt in Java implementiert keine serialisierbaren Parameter. Ich habe gesehen, dass andere die Klasse erweitern, um das zuzulassen, aber für Ihre Situation würde ich einfach empfehlen, das JSON-Objekt als String zu speichern und seine toString () - Funktion zu verwenden. Ich hatte Erfolg damit.

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

Und um es zurück zu bekommen:

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

Es hängt davon ab, wie groß das Array ist. Angenommen, es ist nicht lächerlich groß (weniger als ein paar hundert Kb), speichern Sie es einfach in den gemeinsamen Einstellungen. Wenn es größer ist, können Sie es in einer Datei speichern.

4
Falmarri

um das Json-Array in den gemeinsamen Einstellungen zu speichern, können Sie die Methode in der Klasse wie folgt verwenden

public class CompanyDetails {

@SerializedName("id")
private String companyId;

public String getCompanyId() {
    return companyId;
}
}

in der gemeinsamen Präferenzklasse

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

wert aufrufen

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

Speichern Sie die JSON direkt ab. Betrachten Sie es so: Sie kapseln die Datendarstellung. Wenn Sie ein bestimmtes Objektformat serialisieren, bleiben Sie bei diesem Objektformat oder müssen sich mit möglichen Änderungen an diesem Objekt befassen und sich in Zukunft Sorgen um ein Upgrade von einem alten Serialisierungsformat auf ein neues machen. Wenn Sie es als JSON speichern, können Sie es nach Belieben aufblasen.

1
Brian Dupuis

Ich habe dasselbe getan ... ein Objekt zu einem Json-String serialisiert und in Shared Prefs gespeichert. Kein Problem, aber verstehen Sie, dass die Prefs letztendlich eine XML-Datei sind. Wenn Sie also viel lesen/schreiben, wird sie nicht gut funktionieren. 

1

Ja. Mit SharedPreferences gespeicherte Werte müssen Primitive oder Strings sein. Welche Form würde das serialisierte JSON-Objekt annehmen, wenn nicht primitiv oder String (oder Set)? JSON ist ein serialisiertes Datenformat. Verwenden Sie es, wenn Sie das schon haben.

0
Thane Anthem

Ja, du kannst sparen.

 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

Eine weitere einfache Möglichkeit, JsonArray in Sharedprefrences zu speichern:

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

Rufen Sie einfach diesen Code an, um Ihren Json zu erhalten :-)

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