为什么此Volley请求会生成IllegalStateException

时间:2016-01-08 14:43:36

标签: android json android-volley

我正在尝试拉出一个JSON数组并将其加载到RecyclerView中。这是代码:

JsonArrayRequest TweetReq = new JsonArrayRequest(URL1,
            new Response.Listener<JSONArray>()
            {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d("WORKING RESPONSE:::::", response.toString());
                    //hidePDialog();

                    SharedPreferences Tempx = getSharedPreferences("ActivitySession", Context.MODE_PRIVATE);
                    SharedPreferences.Editor edx = Tempx.edit();
                    edx.putString("GSON_FEED", response.toString());
                    edx.apply();

                    Gson gson = new Gson();
                    JsonParser parser = new JsonParser();
                    JsonArray jArray = parser.parse(Tempx.getString("GSON_FEED","")).getAsJsonArray();

                    //ArrayList<MainPojo> uid = new ArrayList<MainPojo>();

                    for(JsonElement obj : jArray )
                    {
                        MainPojo cse = gson.fromJson( obj , MainPojo.class);
                        TweetList.add(cse);

                    }
                    mAdapter.notifyDataSetChanged();

                    // Parsing json

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error)
        {
            SharedPreferences Tempx = getSharedPreferences("ActivitySession", Context.MODE_PRIVATE);

            try{Gson gson = new Gson();
                JsonParser parser = new JsonParser();
                JsonArray jArray = parser.parse(Tempx.getString("GSON_FEED","")).getAsJsonArray();



                for(JsonElement obj : jArray )
                {
                    MainPojo cse = gson.fromJson( obj , MainPojo.class);
                    TweetList.add(cse);

                }
                mAdapter.notifyDataSetChanged();


                VolleyLog.d("EDUKNOW::::", "Error: " + error.getMessage());
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }



        }
    });

如您所见,我将结果存储到SharedPreferences中并填充它!

然而,当我执行它时,onErrorResponse()一直在执行, 这是logcat:

01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:java.lang.IllegalStateException: This is not a JSON Array. 
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atcom.google.gson.JsonElement.getAsJsonArray(JsonElement.java:106) 
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atcom.fossasia.loklak.Activities.MainActivity$2.onErrorResponse(MainActivity.java:105)
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atcom.android.volley.Request.deliverError(Request.java:564) 
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atcom.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atandroid.os.Handler.handleCallback(Handler.java:739) 
01-08 20:01:08.688 4764-4764/com.fossasia.loklak W/System.err:     atandroid.os.Handler.dispatchMessage(Handler.java:95) 
01-08 20:01:08.689 4764-4764/com.fossasia.loklak W/System.err:     atandroid.os.Looper.loop(Looper.java:148) 
01-08 20:01:08.689 4764-4764/com.fossasia.loklak W/System.err:     atandroid.app.ActivityThread.main(ActivityThread.java:5417) 
01-08 20:01:08.689 4764-4764/com.fossasia.loklak W/System.err:     atjava.lang.reflect.Method.invoke(Native Method) 
01-08 20:01:08.689 4764-4764/com.fossasia.loklak W/System.err:     atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-08 20:01:08.689 4764-4764/com.fossasia.loklak W/System.err:     atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

他第一个错误,这不是一个JSON数组,我猜是因为它试图从最初为空的sharedPreferences加载。

我的问题是:这是由于API中的任何问题或我定义我的POJO的方式吗?

1 个答案:

答案 0 :(得分:1)

我认为问题在于您的POJO实施。我从http://loklak.org/api/search.json?q=apple

检查了您的查询

答案不是JSON Array,而是JSON Object。看到回复的开头?它以大括号{开头,标记对象的开头。我建议你在JSON documentation上阅读一下。

为了获得JSON Array,您需要检查JSON的结构。我将JSON响应复制粘贴到在线JSON格式化程序中,我可以看到有7个对象,其中一个包含您需要的JSON Array。如果您设法将JSON Object作为JSON Array,那么您就可以使用它。

  1. JSONArrayRequest更改为JSONObjectRequest
  2. JSONArray内获取JSONObject(在这种情况下,密钥为"statuses",值为JSONArray
  3. 解析JSONArray
  4. 祝你好运