Swift调用Trefle API返回空数组,请求问题排查帮助
问题排查与修复方案
你的问题出在Model定义错误,导致JSON解码失败,最终返回空数组。具体问题和修复步骤如下:
1. 核心问题:字段类型不匹配
Postman返回的links是一个键值对字典(如{"self": "...", "plant": "..."}),但你的Plant结构体里把links定义成了[String]数组,这会直接触发JSONDecoder解码失败,进入catch分支返回空数组。
另外,synonyms字段虽为数组,但建议用let声明(若API可能返回空数组,也可定义为可选数组[String]?),避免不必要的默认值。
2. 修复后的Model代码
import UIKit import SwiftUI struct PlantResponse: Codable { let data: [Plant] } // 新增结构体匹配API返回的links格式 struct Links: Codable { let `self`: String let plant: String let genus: String } struct Plant: Codable { let id: Int let common_name: String let slug: String let scientific_name: String let year: Int let bibliography: String let author: String let status: String let rank: String let family_common_name: String let family: String let genus_id: Int let genus: String let image_url: String let synonyms: [String] let links: Links // 替换原有的[String]类型 } func fetchPlantsFromAPI() async throws -> [Plant] { // 修正token格式:去掉多余的.,替换为真实token let url = URL(string: "https://trefle.io/api/v1/plants?token=[MYTOKEN]&filter[common_name]=beach%20strawberry")! let (data, _) = try await URLSession.shared.data(from: url) do { let decoded = try JSONDecoder().decode(PlantResponse.self, from: data) return decoded.data } catch { print(error) return [Plant]() } } // 新增打印语句验证结果 Task { do { let plants = try await fetchPlantsFromAPI() print("获取到的植物数据:\(plants)") } catch { print("请求失败:\(error)") } }
3. 额外注意事项
- 确认API URL中的
token格式正确:你原代码里写的token=.[MYTOKEN]多了一个.,需修正为token=[MYTOKEN](替换成你的真实授权token)。 - Playground中调用异步函数时,添加打印语句可直观查看请求结果或错误信息,方便调试。
4. 验证修复效果
修复Model后,JSONDecoder可正确解析API返回的数据,不会再进入catch分支返回空数组,你能正常获取到Beach strawberry的完整数据。
内容的提问来源于stack exchange,提问作者mfredy
相关产品推荐
相关产品推荐

