Android结合RecyclerView解析API返回JSON的方法及代码错误排查
安卓端嵌套JSON解析 + RecyclerView展示问题排查与实现
现有代码的核心错误点
- JSON数组键值不匹配:接口返回的最外层数组key为
SuccessInfo,代码中调用getJSONArray("SuccessInfoBean")是把实体类名和接口字段做了错误绑定,会直接抛出JSON字段不存在的异常。 - 嵌套数组类型解析错误:接口中
value本身就是字符串数组,不是单字符串,直接调用getString("value")会触发类型不匹配异常;同时代码复用全局的stringList存储所有条目的value,会把颜色、类型等不同分类的数据完全混同,不符合数据结构逻辑。 - List添加API使用错误:
infoBean是存储SuccessInfoBean的列表,add方法仅接受单个SuccessInfoBean类型参数,代码中infoBean.add(key, stringList)误用了Map的put语法,属于编译期错误。
修正后的手动解析实现
按照接口的真实结构,补全多层嵌套数组的解析逻辑,代码如下:
List<Clothes.SuccessInfoBean> infoBean = new ArrayList<>(); try { JSONObject rootObject = new JSONObject(myJson2.toString()); // 匹配接口真实key获取SuccessInfo数组 JSONArray successInfoArray = rootObject.getJSONArray("SuccessInfo"); for (int j = 0; j < successInfoArray.length(); j++) { JSONObject itemObj = successInfoArray.getJSONObject(j); String itemKey = itemObj.getString("key"); // 单独解析当前条目下的value数组,每次新建独立列表避免数据混同 JSONArray valueArray = itemObj.getJSONArray("value"); List<String> currentValueList = new ArrayList<>(); for (int k = 0; k < valueArray.length(); k++) { currentValueList.add(valueArray.getString(k)); } // 先构造SuccessInfoBean实例,再添加到infoBean集合 Clothes.SuccessInfoBean bean = new Clothes.SuccessInfoBean(itemKey, currentValueList); infoBean.add(bean); } } catch (JSONException e) { e.printStackTrace(); // 可在此处添加解析失败的用户提示逻辑 }
简化解析的可选方案(Gson)
如果不想手动编写多层循环解析逻辑,可引入Gson工具类直接完成映射解析,仅需补全实体类的getter/setter方法、添加Gson要求的无参构造即可:
调整后的实体类结构:
public class Clothes { // 对应根节点的SuccessInfo数组字段 private List<SuccessInfoBean> SuccessInfo; public static class SuccessInfoBean { private String key; private List<String> value; // Gson解析需要无参构造,原带参构造可保留 public SuccessInfoBean() {} public SuccessInfoBean(String key, List<String> value) { this.key = key; this.value = value; } // 补全getter/setter供Gson访问 public String getKey() { return key; } public void setKey(String key) { this.key = key; } public List<String> getValue() { return value; } public void setValue(List<String> value) { this.value = value; } } public List<SuccessInfoBean> getSuccessInfo() { return SuccessInfo; } public void setSuccessInfo(List<SuccessInfoBean> successInfo) { SuccessInfo = successInfo; } }解析时仅需一行代码即可拿到完整的结构化数据:
Clothes result = new Gson().fromJson(myJson2.toString(), Clothes.class);
RecyclerView适配提示
解析完成后可根据业务需求选择展示逻辑:
- 分类展示模式:每个RecyclerView Item对应一个
SuccessInfoBean分类,在Item内部用横向RecyclerView或流式布局展示当前分类下的所有value选项。 - 扁平化展示模式:将所有SuccessInfo下的value展平,绑定对应的分类key作为数据源,传入Adapter做列表展示。
内容的提问来源于stack exchange,提问作者Ivy
相关产品推荐
相关产品推荐

