我对 swift 真的很陌生。我正在尝试 API 调用,但它只返回一个空数组。我真的不知道我哪里错了。我一直在关注几个教程,但它只返回一个空数组。
我不确定我是否正确定义了模型,或者我尝试从 API 获取数据时可能出了问题。我尝试使用 POSTMAN,以确保 API 正常工作并且正在拉回结果,我尝试从这里的 API 中提取数据 https://docs.trefl.io/docs/advanced/plants-fields#tag/Corrections /操作/createCorrection 。我在这里附上了下面的代码
import UIKit
import SwiftUI
struct PlantResponse: Codable {
let data : [Plant]
}
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
var synonyms = [String]()
var links = [String]()
}
func fetchPlantsFromAPI() async throws -> [Plant] {
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 {
try await fetchPlantsFromAPI()
}
下面是我在操场上运行时得到的输出
下面是我在 POSTMAN 上运行时得到的输出
{ “数据”: [ { “身份证”:263319, "common_name": "海滩草莓", "slug": "草莓", "scientific_name": "草莓", “年份”:1768, "参考书目": "Gard. Dict. ed. 8 : n.° 4 (1768)", "author": "(L.)米尔。", “状态”:“已接受”, “等级”:“种类”, "family_common_name": "玫瑰家族", “属id”:12147, “image_url”:“https://bs.plantnet.org/image/o/8ee87e6f94833055db1c7df5fc07761852b7b1eb”, “同义词”:[ “智利草莓”, “智利委陵菜” ], “属”:“草莓”, “家庭”:“蔷薇科”, “链接”:{ "self": "/api/v1/species/fragaria-chiloensis", "plant": "/api/v1/plants/fragaria-chiloensis", “属”:“/api/v1/genus/fragaria” } } ], “链接”:{ "self": "/api/v1/plants?filter%5Bcommon_name%5D=海滩+草莓", "first": "/api/v1/plants?filter%5Bcommon_name%5D=海滩+草莓&page=1", "last": "/api/v1/plants?filter%5Bcommon_name%5D=海滩+草莓&page=1" }, “元”:{ “总计”:1 } }
感谢您的帮助。
我假设错误正在打印到控制台。那个错误是什么?也许您应该
return [Plant]()
,而不是 throw error
(返回空数组),以便调用者知道发生了错误。
例如,当我解码您的 JSON 时,我收到以下错误:
typeMismatch(Swift.Array
,Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:“数据”,intValue:nil),_JSONKey(stringValue:“索引0”,intValue:0),CodingKeys(stringValue:“链接) ", intValue: nil)], debugDescription: "预期解码 Array 但找到了字典。",underlyingError: nil))
该错误告诉您
links
是 JSON 中的字典,但在您的对象中没有这样定义。相反,您可能想要:
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] // an array of strings
let links: [String: String] // a dictionary; could also be [String: URL]
}
为了让我们可以更清楚地读取 JSON,这里它采用“漂亮”格式:
{
"data": [
{
"id": 263319,
"common_name": "Beach strawberry",
"slug": "fragaria-chiloensis",
"scientific_name": "Fragaria chiloensis",
"year": 1768,
"bibliography": "Gard. Dict. ed. 8 : n.° 4 (1768)",
"author": "(L.) Mill.",
"status": "accepted",
"rank": "species",
"family_common_name": "Rose family",
"genus_id": 12147,
"image_url": "https://bs.plantnet.org/image/o/8ee87e6f94833055db1c7df5fc07761852b7b1eb",
"synonyms": [
"Fragaria vesca var. chiloensis",
"Potentilla chiloensis"
],
"genus": "Fragaria",
"family": "Rosaceae",
"links": {
"self": "/api/v1/species/fragaria-chiloensis",
"plant": "/api/v1/plants/fragaria-chiloensis",
"genus": "/api/v1/genus/fragaria"
}
}
],
"links": {
"self": "/api/v1/plants?filter%5Bcommon_name%5D=beach+strawberry",
"first": "/api/v1/plants?filter%5Bcommon_name%5D=beach+strawberry&page=1",
"last": "/api/v1/plants?filter%5Bcommon_name%5D=beach+strawberry&page=1"
},
"meta": {
"total": 1
}
}
请注意,
links
是一本字典。