Android应用从WebService取JSON填充ListView失败,报JSON转换异常
问题分析与解决方案
从你的Logcat日志里一眼就能揪出核心问题:
org.json.JSONException: Value {"orders":[{"naam":"P. Melissen",...}]} of type org.json.JSONObject cannot be converted to JSONArray
说白了,你的WebService返回的是一个包裹着数组的JSONObject(根节点是{}),但你代码里直接把它当成纯JSONArray([])来解析了,这就是数据加载失败的根本原因。
另外还有个容易忽略的小细节:你代码里用jo.getString("Naam")取数据,但WebService返回的JSON键是小写的naam,这也会导致取不到对应的值。
修正步骤
1. 修复JSON解析逻辑
把原来直接解析JSONArray的代码,改成先解析根JSONObject,再取出里面的orders数组:
private void MPWebservice() { String Webadres = null; String dbResult = "empty"; dbConnect database = new dbConnect(this); try{ String query = "SELECT * FROM adres"; Webadres = "?query=" + URLEncoder.encode(query, "UTF-8"); String con = "https://amje.000webhostapp.com/mariosPizzaJSON.php" + Webadres; dbResult = database.execute(con).get(); } catch (Exception e){ e.printStackTrace(); } try{ // 第一步:先解析根节点的JSONObject JSONObject rootJsonObject = new JSONObject(dbResult); // 第二步:取出里面的orders数组 JSONArray ja = rootJsonObject.getJSONArray("orders"); JSONObject jo = null; data = new String[ja.length()]; for (int i = 0; i < ja.length(); i++){ jo = ja.getJSONObject(i); // 注意这里的键是小写的"naam",和WebService返回的字段名完全一致 data[i] = jo.getString("naam"); } adapter = new ArrayAdapter<String>(this, R.layout.layout_list, R.id.list_item, data); listview.setAdapter(adapter); } catch (Exception e){ e.printStackTrace(); } }
2. 优化提示(非必需但建议)
你当前用database.execute(con).get()的方式会阻塞主线程,虽然StrictMode暂时允许,但在实际应用中可能导致界面卡顿。建议改用AsyncTask的onPostExecute回调来处理结果,或者考虑使用更现代的网络库(比如Retrofit、OkHttp)来简化网络请求和JSON解析。
验证效果
修改后重新运行应用,应该就能正确解析WebService返回的JSON数据,并且把naam字段内容填充到ListView里了。
内容的提问来源于stack exchange,提问作者acesteef
相关产品推荐
相关产品推荐

