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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:12