如何将JSON数组保存到SharedPreferences中,并在另一个活动中再次读取。 Android的

时间:2014-08-12 09:14:32

标签: java android json parsing sharedpreferences

我需要将我的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

5 个答案:

答案 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))+"");