我需要将我的Json数组保存到SharedPreferences中,稍后在不同的Activity中访问它。
这是我的 Json :
的示例Array
(
[status] => success
[reason] => success
[version] => 1
[total] => Array
(
[category_1] => 3
[category_2] => 3
[category_3] => 3
)
[title] => Array
(
[category_1] => Food
[category_2] => Drink
[category_3] => Dessert
)
[data] => Array
(
[category_1] => Array
(
[0] => Array
(
[content_id] => 123456
[name] => Name1
[title] => This is title one
[desc] => This is title description
[thumb] => http://image.jpg
)
[1] => Array
(...
)
[category_2] => Array
(
[0] => Array
(
[content_id] => 123456
[name] => Name1
[title] => This is title one
[desc] => This is title description
[thumb] => http://image.jpg
)
[1] => Array
(...
)
[category_3] => Array
(
[0] => Array
(
[content_id] => 123456
[name] => Name1
[title] => This is title one
[desc] => This is title description
[thumb] => http://image.jpg
)
[1] => Array
( ...
)
)
)
MainActivity:
...
try {
JSONObject jObject = new JSONObject(result);
String status = jObject.getString("status");
if (status.equals("success")) {
// Log.e("status",status);
JSONObject jObject_data = new JSONObject(jObject.getString("data"));
JSONArray jArray_data_category_1 = new JSONArray(jObject_data.getString("category_1"));
JSONArray jArray_data_category_2 = new JSONArray(jObject_data.getString("category_2"));
//JSONArray jArray_data_category_3 = new JSONArray(jObject_data.getString("category_3"));
//Log.e("category_1 *****************************************", jArray_data_category_1.toString());
vc.insertCategory_1Pref(jArray_data_category_1.toString());
这是我的 SharedPrefInput.java:
...
public class SharedPrefInput {
public static final String CATEGORY_1 = "CATEGORY_1";
public static final String CATEGORY_2 = "CATEGORY_2";
public static final String CATEGORY_3 = "CATEGORY_3";
...
这是 VarController
...
//category_1
public void insertCategory_1Pref(String s){
prefSetting = context.getSharedPreferences(SharedPrefInput.DEVICE_SETTING, Context.MODE_PRIVATE);
prefSettingEditor = prefSetting.edit();
prefSettingEditor.putString(SharedPrefInput.CATEGORY_1, s);
prefSettingEditor.commit();
}
public String readCategory_1Pref(){
prefSetting = context.getSharedPreferences(SharedPrefInput.DEVICE_SETTING, Context.MODE_PRIVATE);
return prefSetting.getString(SharedPrefInput.CATEGORY_1, "00");
}
...
这是我试图访问它。但它不起作用。
try {
JSONArray jsonArray2 = new JSONArray(sharedCategory_1Pref.getString(CATEGORY_1, status));
for (int i = 0; i < jsonArray2.length(); i++) {
Log.d("your JSON Array", jsonArray2.getInt(i)+"");
Log.e("inside try", "inside try");
}
} catch (Exception e) {
e.printStackTrace();
Log.e("inside Exception", "inside Exception");
}
当我尝试阅读SharePref时,这是日志:
08-12 09:22:34.757: W/System.err(871): at org.json.JSON.typeMismatch(JSON.java:96)
08-12 09:22:34.787: W/System.err(871): at org.json.JSONArray.getInt(JSONArray.java:357)
08-12 09:22:34.787: W/System.err(871): at com.example.brazilapps.MainActivity$1.onPostExecute(MainActivity.java:158)
08-12 09:22:34.787: W/System.err(871): at com.example.brazilapps.MainActivity$1.onPostExecute(MainActivity.java:1)
08-12 09:22:34.787: W/System.err(871): at android.os.AsyncTask.finish(AsyncTask.java:417)
08-12 09:22:34.797: W/System.err(871): at android.os.AsyncTask.access$300(AsyncTask.java:127)
08-12 09:22:34.797: W/System.err(871): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
08-12 09:22:34.797: W/System.err(871): at android.os.Handler.dispatchMessage(Handler.java:99)
08-12 09:22:34.808: W/System.err(871): at android.os.Looper.loop(Looper.java:123)
08-12 09:22:34.808: W/System.err(871): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-12 09:22:34.818: W/System.err(871): at java.lang.reflect.Method.invokeNative(Native Method)
08-12 09:22:34.827: W/System.err(871): at java.lang.reflect.Method.invoke(Method.java:507)
08-12 09:22:34.827: W/System.err(871): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-12 09:22:34.827: W/System.err(871): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-12 09:22:34.867: W/System.err(871): at dalvik.system.NativeStart.main(Native Method)
08-12 09:22:34.867: E/inside Exception(871): inside Exception
答案 0 :(得分:0)
我想建议您在获得JSON中的结果时将其转换为字符串
并将该字符串作为字符串存储在共享首选项中,并在使用期间在活动中使用该字符串,将保存的字符串转换为JSON对象
使用此行JSONObject obj = new JSONObject(json);
并使用此行将JSONObject转换为字符串
JSONObject foo = yourJSONOject;
String uid = foo.get("CNo").isString().toString();
String type = foo.get("CName").isString().toString();
或者您可以将 toString 用于JSONObject,以便将其转换为字符串
答案 1 :(得分:0)
使用JSONArray.toString()使用putString()将JSON保存为字符串,然后使用getString()将其检索,然后调用new JSONArray(String)
答案 2 :(得分:0)
为什么要调用jsonArray2.getInt(i)
,而您的数组似乎由JSONObject
组成?
请尝试jsonArray2.getJSONObject(i)
。
此外,这部分代码:
JSONArray jArray_data_category_1 = new JSONArray(jObject_data.getString("category_1"));
可以改写为
JSONArray jArray_data_category_1 = jObject_data.getJSONArray("category_1");
答案 3 :(得分:0)
您的JSON看起来像是来自API / Webservices的响应。
为什么要在共享偏好设置中存储此类响应?
我想,只是为了避免在不同的活动中调用相同的api请求?
我建议你实现缓存之类的东西。共享首选项不是用于存储这么大的字符串。
您还可以将该json文件存储在应用程序的files文件夹中,并在需要时读取该文件。 (这就是缓存的作用。)
答案 4 :(得分:0)
因为你在getInt()
行而不是行
Log.d("your JSON Array", jsonArray2.getInt(i)+"");
你可以把它作为字符串并解析为int。
Log.d("your JSON Array", Integer.parseInt(jsonArray2.getString(i))+"");