【问题标题】:Android: JSON parsing errorAndroid:JSON 解析错误
【发布时间】:2014-02-27 06:20:06
【问题描述】:

我的应用程序出现错误。我正在做 JSON 解析。解析没问题,但是我没有得到问题出现在哪里。

我的 JSON 是:

{"status":1,
        "magazines":[{
            "magazinetitle": "Test Magazine 1",
            "magazineid": 100,
            "magazinecoverthumburl": "pages/page1.jpg",
            "magazinecoverlargeurl": "pages/page1.jpg",
            "pages":[{
                "pagenumber": 1,
                "thumburl":"pages/page1.jpg",
                "largeurl":"pages/page1.jpg",
                "subpages": [{
                                "pagenumber": 1,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 2,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 3,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 4,
                                "pagetype": "image"
                            }]
            },
            {
                "pagenumber": 2,
                "thumburl":"pages/page2.jpg",
                "largeurl":"pages/page2.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 3,
                "thumburl":"pages/page3.jpg",
                "largeurl":"pages/page3.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 4,
                "thumburl":"pages/page4.jpg",
                "largeurl":"pages/page4.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 5,
                "thumburl":"pages/page5.jpg",
                "largeurl":"pages/page5.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 6,
                "thumburl":"pages/page6.jpg",
                "largeurl":"pages/page6.jpg",
                "subpages": [{
                                "pagenumber": 1,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 2,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 3,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 4,
                                "pagetype": "image"
                            }]
            },
            {
                "pagenumber": 7,
                "thumburl":"pages/page7.jpg",
                "largeurl":"pages/page7.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 8,
                "thumburl":"pages/page8.jpg",
                "largeurl":"pages/page8.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 9,
                "thumburl":"pages/page15.jpg",
                "largeurl":"pages/page15.jpg",
                "subpages": [{
                                "pagenumber": 1,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 2,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 3,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 4,
                                "pagetype": "image"
                            }]
            },              
            {
                "pagenumber": 10,
                "thumburl":"pages/page8.jpg",
                "largeurl":"pages/page8.jpg",
                "subpages":[]
            }]
        },
        {
            "magazinetitle": "Test Magazine 2",
            "magazineid": 101,
            "magazinecoverthumburl": "pages/page2.jpg",
            "magazinecoverlargeurl": "pages/page2.jpg",
            "pages":[{
                "pagenumber": 1,
                "thumburl":"pages/page1.jpg",
                "largeurl":"pages/page1.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 2,
                "thumburl":"pages/page2.jpg",
                "largeurl":"pages/page2.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 3,
                "thumburl":"pages/page3.jpg",
                "largeurl":"pages/page3.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 4,
                "thumburl":"pages/page4.jpg",
                "largeurl":"pages/page4.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 5,
                "thumburl":"pages/page5.jpg",
                "largeurl":"pages/page5.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 6,
                "thumburl":"pages/page6.jpg",
                "largeurl":"pages/page6.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 7,
                "thumburl":"pages/page7.jpg",
                "largeurl":"pages/page7.jpg",
                "subpages": [{
                                "pagenumber": 1,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 2,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 3,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 4,
                                "pagetype": "image"
                            }]
            },
            {
                "pagenumber": 8,
                "thumburl":"pages/page13.jpg",
                "largeurl":"pages/page13.jpg",
                "subpages":[]
            },
            {
                "pagenumber": 9,
                "thumburl":"pages/page14.jpg",
                "largeurl":"pages/page14.jpg",
                "subpages": [{
                                "pagenumber": 1,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 2,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 3,
                                "pagetype": "video"
                            },
                            {
                                "pagenumber": 4,
                                "pagetype": "image"
                            }]
            }]
        // And so on magazine, pages, subpages are there...
        }]}

我的后台代码如下:

全局变量是

// contacts JSONArray
public static JSONArray status = null, magazines = null, pages = null, subpages = null;

doInBackground(Void...arg0) 代码:

// Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.POST);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                // Getting JSON Array node
                status = jsonObj.getJSONArray(TAG_MAGAZINES);

                Magazine magazine1 = new Magazine();                    

                // looping through All Contacts
                for (int i = 0; i < status.length(); i++) {
                    JSONObject magazine = status.getJSONObject(i);                      

                    String magazineTitle = magazine.getString(TAG_MAGAZINETITLE);
                    magazine1.setMagazineTitle(magazineTitle);
                    magazine1.setMagazineid(String.valueOf(magazine.getInt(TAG_MAGAZINEID)));
                    magazine1.setMagazinecoverthumburl(magazine.getString(TAG_MAGAZINECOVERTHUMBURL));
                    magazine1.setMagazinecoverlargeurl(magazine.getString(TAG_MAGAZINECOVERLARGEURL));

                    String magazineCoverThumbURL = magazine.getString(TAG_MAGAZINECOVERTHUMBURL);
                    String magazineCoverLargeURL = magazine.getString(TAG_MAGAZINECOVERLARGEURL);*/

                    JSONObject jsonObjInnerString = status.getJSONObject(i);
                    pages = jsonObjInnerString.getJSONArray(TAG_PAGES);
                    Pages pagesModel = new Pages();

                    // looping through All Contacts
                    for (int j = 0; j < pages.length(); j++) {
                        JSONObject pagesObject = pages.getJSONObject(j);

                        pagesModel.setPagenumber(String.valueOf(pagesObject.getInt(TAG_PAGENUMBER)));
                        pagesModel.setThumburl(pagesObject.getString(TAG_THUMBURL));
                        pagesModel.setLargeurl(pagesObject.getString(TAG_LARGEURL));
                        magazine1.setPages(pagesModel);

                        JSONObject jsonObjSubInnerString = pages.getJSONObject(j);
                        subpages = jsonObjSubInnerString.getJSONArray(TAG_SUBPAGES);

                        SubPages subPagesModel = new SubPages();

                        // looping through All Contacts
                        for (int k = 0; k < subpages.length(); k++) {
                            Log.d("k",String.valueOf(k));

                            JSONObject subPagesObject = subpages.getJSONObject(k);

                            subPagesModel.setSubpagenumber(String.valueOf(subPagesObject.getInt(TAG_SUBPAGENUMBER)));
                            Log.d("SPgno",String.valueOf(subPagesObject.getInt(TAG_SUBPAGENUMBER)));
                            subPagesModel.setSubpagetype(subPagesObject.getString(TAG_SUBPAGETYPE));
                            subPagesModel.setSubpageurl(subPagesObject.getString(TAG_SUBPAGEURL));
                            pagesModel.setSubPages(subPagesModel);
                        }
                    }

                    // tmp hashmap for single contact
                    HashMap<String, String> magazineDetailsHashMap = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    magazineDetailsHashMap.put(TAG_MAGAZINETITLE, magazineTitle);
                    //magazineDetailsHashMap.put(TAG_MAGAZINEID, magazineID);

                    // adding contact to contact list
                    magazineDetails.add(magazine1);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;

而magzine类的代码如下:

int count = MainActivity.status.length(),l=0;
public String[] magazineTitle = new String[count], magazineid = new String[count], magazinecoverthumburl = new String[count], magazinecoverlargeurl = new String[count];
public Pages[] pages = new Pages[count];
public String[] getMagazineTitle() {
    return magazineTitle;
}
public void setMagazineTitle(String magazineTitle) {
    this.magazineTitle[l] = magazineTitle;
}
public String[] getMagazineid() {
    return magazineid;
}
public void setMagazineid(String magazineid) {
    this.magazineid[l] = magazineid;
}
public String[] getMagazinecoverthumburl() {
    return magazinecoverthumburl;
}
public void setMagazinecoverthumburl(String magazinecoverthumburl) {
    this.magazinecoverthumburl[l] = magazinecoverthumburl;
}
public String[] getMagazinecoverlargeurl() {
    return magazinecoverlargeurl;
}
public void setMagazinecoverlargeurl(String magazinecoverlargeurl) {
    this.magazinecoverlargeurl[l] = magazinecoverlargeurl;
}
public Pages[] getPages() {
    return pages;
}
public void setPages(Pages pages) {
    this.pages[l] = pages;
    l++;
}

错误如下:

2-27 12:01:12.255: W/dalvikvm(15169): threadid=10: thread exiting with uncaught exception (group=0x4001e578)
02-27 12:01:12.255: E/AndroidRuntime(15169): FATAL EXCEPTION: AsyncTask #1
02-27 12:01:12.255: E/AndroidRuntime(15169): java.lang.RuntimeException: An error occured while executing doInBackground()
02-27 12:01:12.255: E/AndroidRuntime(15169):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.lang.Thread.run(Thread.java:1019)
02-27 12:01:12.255: E/AndroidRuntime(15169): Caused by: java.lang.ArrayIndexOutOfBoundsException
02-27 12:01:12.255: E/AndroidRuntime(15169):    at com.oi.jsonparsingnestingdemo.model.Magazine.setPages(Magazine.java:37)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at com.oi.jsonparsingnestingdemo.MainActivity$GetMagazineDetails.doInBackground(MainActivity.java:137)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at com.oi.jsonparsingnestingdemo.MainActivity$GetMagazineDetails.doInBackground(MainActivity.java:1)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-27 12:01:12.255: E/AndroidRuntime(15169):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
02-27 12:01:12.255: E/AndroidRuntime(15169):    ... 4 more

【问题讨论】:

  • 什么是错误?你有 logcat 吗?
  • 发布堆栈跟踪以及发生错误的行。
  • @Bhumika:我用 logcat 编辑了我的帖子。
  • 可能你可以将页面数组的类型更改为arraylist,因为你必须让它成为动态的。

标签: java android arrays json parsing


【解决方案1】:

引起:java.lang.ArrayIndexOutOfBoundsException 02-27 12:01:12.255:E/AndroidRuntime(15169):在 com.oi.jsonparsingnestingdemo.model.Magazine.setPages(Magazine.java:37)

似乎在设置页面时,内部数组pages 可能未正确初始化。请检查int count = MainActivity.status.length(); 是否返回您期望的值

【讨论】:

    【解决方案2】:

    尽管第一个答案可能对您有所帮助,但我肯定会建议您使用 json 解析库。在这种特殊情况下,我使用GSON

    在 Magazine.java 中:

    public class Magazine {
     private String magazinetitle;
     private int magazineid;
     private String magazinecoverthumburl;
     private String magazinecoverlargeurl;
     private List<Page> pages;
     // declare getters for the same fields if you need to read them
     // Setters are not a requirement
    }
    

    在 Response.java 中

    public class Response{
     private int status;
     private List<Magazine> magazines;
     // declare getters for the same fields if you need to read them
     // Setters are not a requirement
    }
    

    其实不用这个类你也可以愉快地生活,结合JSONObject和GSON解析,但是现在JSONObject的方法对我来说太麻烦了。

    现在你的doInBackground 变成了:

    // Making a request to url and getting response
    String jsonStr = sh.makeServiceCall(url, ServiceHandler.POST);
    Gson gson = new Gson();
    Response response = gson.parse(jsonStr , Response.class);
    

    这将填写您需要的所有字段。我没在闹着玩。您不需要自己进行任何手动解析。你不会有任何方法导致错误。

    对于更高级的用法,您还可以使用 @SerializedName 注释使 java 字段以精美的驼峰式大小写,而不是在同一大小写中混淆多个单词。

    【讨论】:

      【解决方案3】:

      正如 Boris Strandjev 指出的那样,最好的解决方案是使用 GSON。 如果您想避免使用该库并继续自己进行解析,您可以:

      setPages(Pages pages)
      {
      if(pages.length >= l-1)
      return;
      this.pages[l] = pages;
          l++;
      }
      

      这应该可以防止您的应用崩溃。 您应该在 Magazine 构造函数中传递页数,而不是静态访问它。

      【讨论】:

        【解决方案4】:

        @MarioStoilov 的答案是正确的。他正在为你指明正确的方向。 您因 ArrayIndexOutOfBoundsException 而崩溃,原因是:

        int count = MainActivity.status.length();//is the issue
        

        您的崩溃是因为:

        public void setPages(Pages pages) { //by the way. here, I would change "Pages pages" to "Pages  page" because your getting one page from the many pages
            this.pages[l] = pages;
            l++;
        }
        

        为什么?....

        好吧,假设你这样做:

        int count =0;
        public Pages[] pages = new Pages[count];
        

        然后你尝试这样做:

        Pages onePage = pages[0];
        

        您将收到 ArrayIndexOutOfBoundsException。要从“pages[]”中请求和项目,它至少需要在其中包含一项。项目是否为空无关紧要。它仍然需要一个。您的代码可以工作的唯一方法是如果 count 为 = 或 > 1. NEVER 0

         int count =1;//this MUST be greater then 0 never never 0 or will crash 
        public Pages[] pages = new Pages[count];
        
        public void setPages(Pages pages) {
            this.pages[l] = pages;
            l++;
        }
        

        但这一切都表明您的代码存在更大的问题。假设您让您的代码 100% 运行。好吧,现在您依赖 JSON 始终始终返回大于 0 的值。而且我不确定您的代码的目的,但也许就是这种情况。在您的代码的生产版本中,您将始终获得大于 0 的值。也许是这样,但在极少数情况下,如果您从 JSON 中获得 0,它将崩溃。无论。同样,我不确定什么会导致您在现实世界场景中从 JSON 中获得 0,但如果您曾经获得 0,它将崩溃。我的建议是包装设置的页面:尝试和捕捉中的无效

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多