【问题标题】:Receiving JSON Exception "Unterminated Array" while parsing html data解析 html 数据时接收 JSON 异常“未终止的数组”
【发布时间】:2016-07-02 05:40:26
【问题描述】:

我正在尝试访问 google 图书 api 并根据用户输入的关键字检索图书列表。在尝试解析 Json 数据时,我收到以下错误:

我用来解析 JSON 数据的方法:

W/System.err: org.json.JSONException: Unterminated array at character 11 of [C@425e2fb8

W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:450)

W/System.err:     at org.json.JSONTokener.readArray(JSONTokener.java:440)

W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:103)

W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:155)

W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:172)

W/System.err:     at com.example.android.booklisting.BookListingActivity.readIt(BookListingActivity.java:167)

W/System.err:     at com.example.android.booklisting.BookListingActivity.downloadUrl(BookListingActivity.java:145)

W/System.err:     at com.example.android.booklisting.BookListingActivity.access$100(BookListingActivity.java:39)

W/System.err:     at com.example.android.booklisting.BookListingActivity$DownloadWebpageTask.doInBackground(BookListingActivity.java:96)

W/System.err:     at com.example.android.booklisting.BookListingActivity$DownloadWebpageTask.doInBackground(BookListingActivity.java:90)

W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)

W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)

W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)

W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

W/System.err:     at java.lang.Thread.run(Thread.java:841)

com.example.android.booklisting I/dalvikvm: Could not find method android.widget.ArrayAdapter.getDropDownViewTheme, referenced from method    com.example.android.booklisting.BooksAdapter.access$super

我用来解析 JSON 数据的方法:

  public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    String jdata = buffer.toString();

    try {
        JSONObject jsonobject = new JSONObject(jdata);
        JSONArray jarray = (JSONArray) jsonobject.getJSONArray("items");

        for (int i = 0; i < jarray.length(); i++) {
            JSONObject volumeInfo = jarray.getJSONObject(i).getJSONObject("volumeInfo");
            String title = volumeInfo.getString("title");
            JSONArray authors = volumeInfo.getJSONArray("authors");
            for (int j = 0; j < authors.length(); j++) {
                String author = authors.getString(i);
                books.add(new Book(title,author));
            }

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


    return new String(buffer);

}

关于我在解析中可能出错的地方有什么想法吗?这是我的第一个解析程序。

【问题讨论】:

  • 检查我的答案,如果它不起作用,请将您的 json 响应放在这里
  • json 响应格式不正确

标签: android json android-studio


【解决方案1】:

我认为错误出现在您的作者 for 循环中,因此通过以下代码对其进行了更改,

for (int j = 0; j < authors.length(); j++)
{
    String author = authors.getString(j);
    books.add(new Book(title,author));
}

【讨论】:

    【解决方案2】:

    您的代码中有索引异常。将字符串author = authors.getString(i);改为String author = authors.getString(j);

      public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
        Reader reader = null;
        reader = new InputStreamReader(stream, "UTF-8");
        char[] buffer = new char[len];
        reader.read(buffer);
        String jdata = buffer.toString();
    
        try { 
            JSONObject jsonobject = new JSONObject(jdata);
            JSONArray jarray = (JSONArray) jsonobject.getJSONArray("items");
    
            for (int i = 0; i < jarray.length(); i++) {
                JSONObject volumeInfo = jarray.getJSONObject(i).getJSONObject("volumeInfo");
                String title = volumeInfo.getString("title");
                JSONArray authors = volumeInfo.getJSONArray("authors");
                for (int j = 0; j < authors.length(); j++) {
                    String author = authors.getString(j);
                    books.add(new Book(title,author));
                } 
    
            } 
        } catch (JSONException e) {
            e.printStackTrace();
        } 
    
    
        return new String(buffer);
    
    } 
    

    【讨论】:

      【解决方案3】:

      用你的 JSON 响应检查 jdata 可能是你没有在 jdata 中写完整的字符串

      请尝试从InputStream获取完整字符串

      BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
      StringBuilder total = new StringBuilder();
      String line;
      
      while ((line = r.readLine()) != null)
      {
          total.append(line).append('\n');
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 1970-01-01
        • 2015-02-02
        • 2021-01-03
        • 2021-12-16
        相关资源
        最近更新 更多