如何解析复杂嵌套JSON 提取图片地址在ListView的ImageView中展示
复杂JSON接口图片提取与ListView展示实现方案
一、先校准JSON取数路径
- 结合给出的响应结构示例,图片地址的完整提取链路为:接口根响应 →
items数组 → 数组内单条条目对象 →variations节点 →adapted节点 →url字段 - 注意不要漏掉中间的
variations嵌套层,这是取数时出现空指针、取不到值的最常见诱因,不是从items条目下直接对接adapted节点。
二、核心实现流程
- 按需定义对应结构的实体类,不需要把JSON里所有字段都做映射,只保留取数路径上的关联字段即可,降低解析内存开销:
// 根响应类 public class ListResponse { public List<WallpaperItem> items; } // items数组单条条目类 public class WallpaperItem { public VariationsBean variations; } // 中间variations节点类 public class VariationsBean { public AdaptedBean adapted; } // adapted节点类 public class AdaptedBean { public String url; } - 可选两种解析方案:
- 用Gson、Moshi等解析框架直接把接口返回的JSON字符串映射成上述实体类,遍历items列表时直接读取每个条目的adapted.url值
- 用原生org.json解析时,逐层向下取节点,每一步操作都加字段存在性判断,避免结构缺失导致崩溃,示例代码:
JSONObject root = new JSONObject(apiResponseStr); JSONArray items = root.getJSONArray("items"); ArrayList<String> imageUrlList = new ArrayList<>(); for (int i = 0; i < items.length(); i++) { JSONObject item = items.getJSONObject(i); if (item.has("variations")) { JSONObject variations = item.getJSONObject("variations"); if (variations.has("adapted")) { JSONObject adapted = variations.getJSONObject("adapted"); if (adapted.has("url")) { imageUrlList.add(adapted.getString("url")); } } } }
- 把提取到的图片URL列表传入自定义ListView适配器,在适配器的getView回调中找到对应位置的ImageView控件
- 不要自行实现网络图片下载逻辑,直接调用成熟图片加载库把URL绑定到ImageView,自动完成内存/磁盘缓存、列表滚动时的图片请求优先级调度、加载占位展示等流程,避免列表滚动卡顿。
三、高频踩坑提醒
- 布局复用错位:ListView的item视图是循环复用的,加载图片前必须给ImageView设置固定占位图,否则快速滚动时会出现同位置显示其他条目图片的串位问题
- 空值容错:部分接口条目可能缺失variations、adapted或url字段,必须在取数、绑定时加判空逻辑,缺失值直接给ImageView设置默认占位图,不要直接强转取值
- 主线程限制:图片的网络请求、JSON解析操作必须放到子线程执行,避免阻塞主线程导致应用无响应
内容的提问来源于stack exchange,提问作者Regex
相关产品推荐
相关产品推荐

