【问题标题】:How to save a JSON array into SharedPreferences and read again in a different activity. Android如何将 JSON 数组保存到 SharedPreferences 并在不同的活动中再次读取。安卓
【发布时间】:2014-08-12 09:14:31
【问题描述】:

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

【问题讨论】:

  • 只需将其保存为字符串(json.toString)并检索它解析它。您在此过程中是否面临任何具体问题?
  • 究竟是什么不起作用?任何错误,异常?请张贴日志条目。您调用 vc.insertCategory_1Pref(...) 而不是 vc.readCategory_1Pref() 似乎很奇怪。
  • /感谢您的 cmets。我在上面添加了错误日志。

标签: java android json parsing sharedpreferences


【解决方案1】:

我想建议你,当你得到 JSON 中的 Result 时,将其转换为字符串

并将共享首选项中的字符串存储为字符串,并在使用期间在活动中使用该字符串将保存的字符串转换为 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 以便将其转换为字符串

【讨论】:

    【解决方案2】:

    使用 JSONArray.toString() 将 JSON 作为字符串保存到使用 putString() 的 SharedPreferences 中,稍后使用 getString() 检索它,然后调用 new JSONArray(String)

    【讨论】:

      【解决方案3】:

      你为什么打电话给jsonArray2.getInt(i),而你的数组似乎由JSONObjects 组成?

      改用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");
      

      【讨论】:

        【解决方案4】:

        您的 JSON 看起来像来自 API/Web 服务的响应。

        为什么要将这样的响应存储在 Shared Preferences 中?

        我猜,只是为了避免在不同的活动中调用相同的 api 请求?

        我建议你实现类似缓存的东西。 Shared Preferences 不适用于存储如此大的字符串。

        您还可以将该 json 文件存储在应用程序的文件夹中,并在需要时读取该文件。 (这就是缓存的作用。)

        【讨论】:

        • 我的应用,有 3 个标签,显示食物类别的 img。所以,我只想在主 Activity 上加载应用程序时调用一次 API。然后在每个选项卡中,我只是从 Shared Preferences 中读取数据
        • 如果您每次打开应用程序时都在访问 API(如果我错了,请纠正我),那么在这种情况下,您应该将数据存储在某个模型类中并使用其对象来检索数据。
        【解决方案5】:

        因为您在 getInt() 行中得到类型不匹配,而不是在行

        Log.d("your JSON Array", jsonArray2.getInt(i)+"");
        

        您可以将其作为字符串获取并解析为 int。

        Log.d("your JSON Array", Integer.parseInt(jsonArray2.getString(i))+"");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多