web-dev-qa-db-ja.com

SharedPreferencesにJSON配列を保存しても問題ありませんか?

保存する必要があるJSON配列があります。それをシリアル化することを考えていましたが、SharedPreferencesに文字列として保存し、それを読み込む必要があるときに再構築する方が良いでしょうか?

32
Sheehan Alam

JavaのJSONオブジェクトは、そのままでは直列化可能を実装していません。他の人がクラスを拡張してそれを可能にするのを見てきましたが、あなたの状況では、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) {
           try {
               JSONObject response = new JSONObject(strJson);

         } catch (JSONException e) {

         }
  }

http://developer.Android.com/reference/org/json/JSONObject.html#JSONObject(Java.lang.String)

64
sgarman

配列の大きさによって異なります。とんでもないほど大きい(数百KB未満)と仮定して、共有設定に保存します。それよりも大きい場合は、ファイルに保存できます。

4
Falmarri

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

JSONを直接保存します。このように見てください。データ表現をカプセル化しています。特定のオブジェクト形式をシリアル化した場合、そのオブジェクト形式で立ち往生するか、そのオブジェクトへの可能な変更に対処し、将来、古いシリアル化形式から新しい形式にアップグレードすることを心配する必要があります。それをJSONとして保存すると、必要に応じて膨張させることができます。

1
Brian Dupuis

私は同じことをしました...オブジェクトをjson文字列にシリアル化し、それを共有設定に保存します。問題ありませんが、最終的に設定がXMLファイルであることを理解してください。そのため、多くのファイルを読み書きしていると、うまく機能しません。

1

はい。 SharedPreferencesで保存される値は、プリミティブまたは文字列である必要があります。プリミティブまたは文字列(またはセット)でない場合、シリアル化されたJSONオブジェクトはどのような形式になりますか? JSONはシリアル化されたデータ形式です。それがあなたがすでに持っているものなら、それを使ってください。

0
Thane Anthem

はい、保存できます。

 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

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

このコードを呼び出して、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) {
                            }