如何为RecyclerView配置自定义实体类List存储JSON数据并解决报错
问题解决思路与方案
错误根源
你遇到的org.json.JSONException: No value for [Ljava.lang.String;@1b3da99报错,是由3处代码逻辑错误导致的:
- 类型使用错误:
dateFormat是你调用split方法得到的字符串数组,直接用String.valueOf(dateFormat)得到的是字符串数组的内存地址标识,不是有效字段名,你用这个不存在的key去JSONObject中取值,自然会抛出找不到字段的异常。 - 变量名不匹配:你实例化的实体类对象是
Book book = new Book(),但调用set方法时写的是astro.setDate,astro变量未定义,运行也会报错。 - 逻辑误用:你对日期做月份格式化的目的是将原始日期字符串转成你要的展示格式,不需要再从JSONObject中二次取值,你原来的取值逻辑本身就是冗余错误的。
修复方案
把你处理日期、给实体类赋值的代码替换为以下逻辑即可:
String Date = jsonObject.getString("date"); String[] dateSplit = Date.split("-"); switch (dateSplit[1]) { case "1": dateSplit[1] = "Jan."; break; case "2": dateSplit[1] = "Feb."; break; // 剩下的月份转换case保持不变 case "12": dateSplit[1] = "Dec."; break; } // 拼接得到格式化后的日期字符串,可根据你的展示需求调整拼接规则 String formattedDate = dateSplit[0] + " " + dateSplit[1] + " " + dateSplit[2]; // 给Book对象赋值,注意变量名对应 Book book = new Book(); book.setDate(formattedDate); // 其余属性赋值逻辑同理 bList.add(book);
其他注意事项
- 你贴出的第一版可运行代码中
String dateFormat = jsonObject.getString(String.valueOf(dateFormat)));本身就是错误逻辑,大概率是你贴代码时的笔误,正常可运行的版本应该是直接拼接了格式化后的日期字符串存入HashMap,没有二次调用jsonObject.getString。 - 可将Book类的属性改为private符合Java封装规范,不强制但推荐。
- AsyncTask已被Android官方废弃,后续优化时可替换为协程、OkHttp等更稳定的网络请求方案。
内容的提问来源于stack exchange,提问作者Serya
相关产品推荐
相关产品推荐

