Android AsyncTask解析JSON报错‘no value for data’求助
排查“no value for data” JSON解析错误
嘿,我一眼就定位到问题所在了!你的核心错误出在JSONObject的初始化方式上——你现在创建了一个空的JSON对象,根本没用到接口返回的真实数据!
错误根源
你当前的代码里写了:
JSONObject jsonObject = new JSONObject();
这行代码会生成一个完全空的JSON对象,和你从接口拿到的json字符串没有任何关联。空对象里当然找不到data字段,所以才会抛出“no value for data”的异常。
修复方案
把接口返回的JSON字符串传入JSONObject的构造方法,这样才能解析真实的响应数据:
JSONObject jsonObject = new JSONObject(json);
修正后的关键代码片段
if (json != null) { try { // 重点:传入接口返回的json字符串,而非创建空对象 JSONObject jsonObject = new JSONObject(json); JSONArray data = jsonObject.getJSONArray("data"); for (int i = 0; i < data.length(); i++) { JSONObject ar = data.getJSONObject(i); String aset = ar.getString("name"); JSONObject parent = ar.getJSONObject("asset_parent"); String nama = parent.getString("name"); // 建议指定泛型,避免类型警告 HashMap<String, String> map = new HashMap<>(); map.put(in_aset, aset); map.put(in_ruang, nama); data_map.add(map); } } catch (final JSONException e) { Log.e(TAG, "Json parsing error: " + e.getMessage()); getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getActivity().getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }); } }
额外优化建议
AsyncTask的onPostExecute方法本身就是在UI线程执行的,你可以把UI更新逻辑移到这里,省去runOnUiThread的调用,让代码更简洁:
@Override protected void onPostExecute(String s) { pDialog.dismiss(); // 在这里更新ListView list = (ListView) getView().findViewById(R.id.baik_list); adapter = new AssetsAdapter(getActivity(), data_map); list.setAdapter(adapter); setListViewHeightBasedOnChildren(list); }
这样就可以把doInBackground里的那段UI更新代码删掉啦。
内容的提问来源于stack exchange,提问作者Mo Ne
相关产品推荐
相关产品推荐

