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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 13:24:04