You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:08:44