Android Studio解析Unsplash API返回JSON数组遇TypeMismatch错误求助
解决Unsplash API JSON TypeMismatch及数据提取问题
嘿,刚接触Android和Java就敢做API调用的应用,给你点个赞!咱们来一步步搞定这个JSON解析的问题~
首先你说对了核心:Unsplash返回的是JSON对象数组,但你之前的代码只处理了单个JSONObject,哪怕改成JSONArray,没做后续的遍历和嵌套解析肯定还是不行的。我来给你修正代码,顺便把你需要的用户姓名、头像、图片URL都正确提取出来。
第一步:修正解析方法,适配JSON数组
原来的方法返回单个NewPhotos对象,但API返回的是多个图片数据,所以咱们要改成返回列表,同时遍历数组里的每个元素:
private List<NewPhotos> getNewPhotos(String jsonData) throws JSONException { List<NewPhotos> photosList = new ArrayList<>(); // 外层是JSON数组,先初始化JSONArray JSONArray photosArray = new JSONArray(jsonData); // 遍历数组中的每一张图片数据 for (int i = 0; i < photosArray.length(); i++) { // 取出数组里的单个图片对象 JSONObject photoObj = photosArray.getJSONObject(i); // 提取图片的URL(Unsplash的图片地址在urls对象下,这里取regular尺寸,你也可以换其他尺寸) JSONObject urlsObj = photoObj.getJSONObject("urls"); String imageUrl = urlsObj.getString("regular"); // 提取用户(摄影师)的信息 JSONObject userObj = photoObj.getJSONObject("user"); String userName = userObj.getString("name"); // 用户头像在profile_image对象下,取medium尺寸 JSONObject avatarObj = userObj.getJSONObject("profile_image"); String userAvatarUrl = avatarObj.getString("medium"); // 创建NewPhotos对象并加入列表 photosList.add(new NewPhotos(userName, userAvatarUrl, imageUrl)); } return photosList; }
第二步:确保NewPhotos类结构匹配
你需要给NewPhotos类添加对应的属性和构造方法,这样才能存储提取到的数据:
public class NewPhotos { // 存储需要的字段 private String userName; private String userAvatarUrl; private String imageUrl; // 构造方法,用于初始化数据 public NewPhotos(String userName, String userAvatarUrl, String imageUrl) { this.userName = userName; this.userAvatarUrl = userAvatarUrl; this.imageUrl = imageUrl; } // 可选:添加getter方法,方便后续在UI上展示数据 public String getUserName() { return userName; } public String getUserAvatarUrl() { return userAvatarUrl; } public String getImageUrl() { return imageUrl; } }
为什么之前改JSONArray没用?
你之前只改了外层的JSONObject为JSONArray,但没做这几件关键的事:
- 没有遍历数组里的每个图片对象
- 没有解析嵌套的子对象(比如图片的
urls、用户的profile_image) - 没有把提取到的字段赋值给
NewPhotos对象
额外小提示
为了避免字段不存在导致的崩溃,你可以用optString()代替getString(),比如:
String userName = userObj.optString("name", "匿名摄影师");
第二个参数是默认值,如果API返回里没有这个字段,就用默认值兜底。
内容的提问来源于stack exchange,提问作者Biii
相关产品推荐
相关产品推荐

