【问题标题】:NullPointerException when parsing JSON in Android [closed]在 Android 中解析 JSON 时出现 NullPointerException [关闭]
【发布时间】:2013-05-24 12:57:54
【问题描述】:

我是这个 android 编程的新手,我在解析 JSON 时遇到了问题。 这是我要解析 Billers 并查看到 ListView 的 JSON URL。我有一些我已经使用并成功提取我想要的值的代码。问题是我不能或者准确地说我在解析 JSON 数组时遇到了问题。 这是我用于解析 JSON 数组的代码:

public class BillersJsonParser {
String mUrl;

public BillersJsonParser(String url){
    this.mUrl = url;
}

public BillersModel getCategories(){
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(mUrl);

    try {
        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();

        String result = sb.toString();
        return parse(result);
    } catch (JSONException e) {
        return null;
    } catch (ClientProtocolException e) {
        return null;
    } catch (IOException e) {
        return null;
    }
}

private BillersModel parse(String result) throws JSONException{
    BillersModel billerList = new BillersModel();
    
    JSONObject jObject = new JSONObject(result);
    
    JSONArray bList = jObject.getJSONArray("billers");
    
    Log.e("BJSONParser 2nd Lvl: ", bList.toString());
    int length = bList.length();
    for (int i = 0; i < length; i++){
        billerList.setID(bList.getJSONObject(i).getString("bid"));
        billerList.setName(bList.getJSONObject(i).getString("name"));
        billerList.setStatus(bList.getJSONObject(i).getString("status"));
        billerList.setDateAdded(bList.getJSONObject(i).getString("date_added"));
    }
    return billerList;
}

}

每次我运行这段代码时都会出现 Null 异常错误,我无法弄清楚。我怀疑当eclipse尝试运行这部分代码JSONArray bList = jObject.getJSONArray("billers");时错误开始了。任何帮助将不胜感激。

【问题讨论】:

  • json 是 utf-8,不是 iso
  • 如果您使用的是 Eclipse,您应该有一个 Stacktrace,您甚至可以在其中单击以转到引发异常的行。至少设置 StackTrace 和行号会有所帮助...
  • 不要丢弃你的异常。 e.printstacktrace 他们
  • catch (JSONException e) { return null; } 这样的代码是非常糟糕的做法

标签: java android json android-listview


【解决方案1】:

根据Billers 你的jObject IS JSONArray。而你在做什么 - 假设 jObject 是 JSONObject 具有名为 billers 的数组属性,如

{"billers":[{"bid":"1","name":"biller1","logo":"","status":"1","date_added":"2013-03-20 23:03:55"},{"bid":"2","name":"biller2","logo":"","status":"1","date_added":"2013-03-20 23:03:55"},{"bid":"3","name":"biller3","logo":"","status":"1","date_added":"2013-03-20 23:04:06"},{"bid":"4","name":"biller4","logo":"","status":"1","date_added":"2013-03-20 23:04:06"}]}

是的,@njzk2 是对的,json 是 UTF-8。此外,添加换行符"\n" 的阅读看起来很奇怪。

【讨论】:

  • 我似乎无法理解。我使用代码来解析像这样 {"response":"false","errors":""} 的 Json 值,它工作得很好。我很困惑是否应该使用该 for 循环在列表视图上显示我的数据。
  • 顺便说一句 JSONArray("billers");我认为这就是问题所在。 billers 不是 json 数组节点。我只是对此做了一些假设,因为 JSONArray("api.androidhive.info/contacts/[/link],它的联系人是 JSONArray。
  • 如果 888partners.com/api/billers 是实际的,则响应仅包含 json 数组,但不包含具有 billers 属性的对象。所以 jObject.getJSONArray("bilers") 是不正确的。尝试 JSONArray jObject = new JSONArray(result) 并遍历它的值。无论如何,有时在崩溃代码之前放置断点并逐步执行代码是有帮助的。
  • 别忘了把iso改成utf-8。并且您可能会发现在 catch 块中添加异常记录/打印很有用。这将帮助您找出发生在哪条线路崩溃。
  • 好的,我先试试那个,然后再向你们寻求帮助。非常感谢你们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多