Swift调用Unsplash API返回数据但JSON解析提示数据缺失如何解决
问题原因排查
首先可以排除API密钥使用错误:如果密钥无效或权限异常,Unsplash会返回401未授权响应,返回的data会是错误提示JSON,不会触发解析Photo数组时的字段缺失报错。
当前报错的核心原因是你定义的Photo结构体和Unsplash API返回的JSON结构不匹配:
- Unsplash返回的
alt_description字段允许为空,你将其定义为非可选的String类型,当接口返回该字段为null时,JSONDecoder会直接抛出数据缺失的错误。 - 你当前打印的
error.localizedDescription信息过于模糊,无法直接定位问题,建议打印完整的error对象即可看到具体是哪个字段解析失败。
修复方案
1. 修改Photo结构体
将alt_description调整为可选类型即可解决当前报错:
struct Photo: Identifiable, Decodable { var id: String var alt_description: String? // 改为可选类型,兼容空值场景 var urls: [String: String] }
如果需要更安全的类型校验,也可以将urls字段定义为明确的结构体,避免后续取值时的类型判断:
struct Photo: Identifiable, Decodable { struct Urls: Decodable { let raw: String let full: String let regular: String let small: String let thumb: String } var id: String var alt_description: String? var urls: Urls }
2. 优化错误打印逻辑
调整catch块的错误打印内容,方便后续排查其他解析问题:
catch { print("解析错误: \(error)") }
3. 额外注意事项
你当前使用@ObservedObject声明randomImages,需要确保UnsplashData类遵循ObservableObject协议,且存储数据的photoArray属性添加了@Published修饰,否则数据更新后无法触发UI刷新。
内容的提问来源于stack exchange,提问作者Justin Philip Fulkerson
相关产品推荐
相关产品推荐

