Android - 如何将JSON对象添加到sharedPreferences?

red*_*rom 3 android json

我想将数据附加到现有的JSON对象中,并将数据作为字符串保存到具有以下结构的共享首选项中.

"results":[
          {
             "lat":"value",
             "lon":"value"
          }, 
          {
             "lat":"value",
             "lon":"value"

          }
        ]
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

我试过这样的事,但没有运气.

// get stored JSON object with saved positions
String jsonDataString = this.getSharedPreferencesStringValue(ctx, "positions", "last_positions");

if (jsonDataString != null) {
    Log.i(AppHelper.APP_LOG_NAMESPACE, "JSON DATA " + jsonDataString);
    JSONObject jsonData = new JSONObject(jsonDataString);
    jsonData.put("lat", lat.toString());
    jsonData.put("lon", lon.toString());
    jsonData.put("city", city);
    jsonData.put("street", street);
    jsonData.put("date", appHelper.getActualDateTime());
    jsonData.put("time", appHelper.getActualDateTime());
    this.setSharedPreferencesStringValue(ctx, "positions", "last_positions", jsonData.toString());
} else {
    this.setSharedPreferencesStringValue(ctx, "positions", "last_positions","{}");                  
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议.

Sal*_*lem 8

我认为实现这一目标的更简单方法是使用Gson.

如果您使用的是gradle,则可以将其添加到依赖项中

compile 'com.google.code.gson:gson:2.2.4'
Run Code Online (Sandbox Code Playgroud)

要使用它,您需要为需要加载的对象定义类.在你的情况下,它将是这样的:

// file MyObject.java
public class MyObject {
    List<Coord> results = new ArrayList<Coord>();    

    public static class Coord {
        public double lat;
        public double lon;
}
Run Code Online (Sandbox Code Playgroud)

然后只需在需要时使用它来往/离开Json:

String jsonDataString = this.getSharedPreferencesStringValue(ctx, "positions", "last_positions");
Gson gson = new Gson();
MyObject obj = gson.fromJson(jsonDataString, MyObject.class);
// Noew obj contains your JSON data, so you can manipulate it at your will.
Coord newCoord = new Coord();
newCoord.lat = 34.66;
newCoord.lon = -4.567;
obj.results.add(newCoord);
String newJsonString = gson.toJson(obj);
Run Code Online (Sandbox Code Playgroud)