Android JSON解析报错:asset_parent为null无法转为JSONObject
解决JSON解析中
asset_parent为null导致的类型不匹配异常 你的问题很明确:当JSON中的asset_parent字段为null时,直接调用getJSONObject()会抛出JSONException,因为org.json库无法把null值转换成JSONObject类型。看你的JSON数据,第一个对象的asset_parent就是null,这就是触发错误的核心原因。
解决方案:先判断asset_parent是否为null
在解析asset_parent之前,先用isNull()方法检查该字段是否为null,再分情况处理:
修改你doInBackground里的解析循环逻辑,替换原来的处理代码:
for (int i = 0; i < data.length(); i++) { JSONObject ar = data.getJSONObject(i); String aset = ar.getString("name"); // 给父资产名称设置默认值,避免null显示问题 String nama = "无父资产"; // 先判断asset_parent是否为null,非null时再解析 if (!ar.isNull("asset_parent")) { JSONObject parent = ar.getJSONObject("asset_parent"); nama = parent.getString("name"); } HashMap map = new HashMap(); map.put(in_aset, aset); map.put(in_ruang, nama); data_map.add(map); }
额外优化建议
另外还有个小细节:你在doInBackground里调用getActivity().runOnUiThread()更新ListView,其实更规范的做法是把UI更新逻辑移到onPostExecute()方法中——因为AsyncTask的onPostExecute()本身就在UI线程执行,不需要额外切换线程:
@Override protected String doInBackground(String...params) { String link_url = "https://example.com/api/assets"; HttpHandler sh = new HttpHandler(); String json = sh.makeServiceCall(link_url); Log.e(TAG, "Response from url: " + json); if (json != null) { try { 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"); String nama = "无父资产"; if (!ar.isNull("asset_parent")) { JSONObject parent = ar.getJSONObject("asset_parent"); nama = parent.getString("name"); } HashMap 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(); } }); } } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); pDialog.dismiss(); // 在这里统一处理UI更新 list = (ListView) getView().findViewById(R.id.baik_list); adapter = new AssetsAdapter(getActivity(), data_map); list.setAdapter(adapter); setListViewHeightBasedOnChildren(list); }
这样修改后,就能正确处理asset_parent为null的场景,不会再抛出类型不匹配的异常了。
内容的提问来源于stack exchange,提问作者Mo Ne
相关产品推荐
相关产品推荐

