Swift 中的 API 调用返回空数组

问题描述 投票:0回答:1

我对 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 } }

感谢您的帮助。

swift xcode
1个回答
0
投票

我假设错误正在打印到控制台。那个错误是什么?也许您应该

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
是一本字典。

© www.soinside.com 2019 - 2024. All rights reserved.