gpt4 book ai didi

json - 解析一些 JSON 数据的问题 - Swift 5

转载 作者:行者123 更新时间:2023-11-28 13:37:09 24 4
gpt4 key购买 nike

我认为这很简单,我假设我只是遗漏了一些关于 JSON 结构的信息。我有一些代码可以从 API 句柄中提取一些数据以获取国家/地区名称列表:

https://restcountries.eu/rest/v2/all?fields=name

这是 API 数据的示例,但请随时使用上面的链接查看它:

[{"name":"Afghanistan"},{"name":"Åland Islands"},{"name":"Albania"},{"name":"Algeria"},{"name":"American Samoa"},{"name":"Andorra"},{"name":"Angola"},{"name":"Anguilla"},{"name":"Antarctica"},{"name":"Antigua and Barbuda"},{"name":"Argentina"}

我创建了这个结构来保存数据

struct CountryList: Codable {
public let country: [Country]
}

struct Country: Codable {
public let name: String
}

我有这两个函数来创建 URLRequest,然后获取数据并通过完成处理程序返回它:

private func setupApiUrlRequest(apiURL: String) throws -> URLRequest {
let urlString = apiURL
guard let url = URL(string: urlString) else {
print("Error setting up URL")
throw CountriesError.invalidURLString
}

var request = URLRequest(url: url)
request.httpMethod = "GET"
return request
}

func getCountries(completion: @escaping (Country?, URLResponse?, Error?) -> Void) {
if let request = try? setupApiUrlRequest(apiURL: "https://restcountries.eu/rest/v2/all?fields=name") {
URLSession.shared.dataTask(with: request) { data,response,error in
guard let data = data else {
completion(nil, response, error)
return
}
do {
let decoder = JSONDecoder()
let downloadedCountries = try decoder.decode(Country.self, from: data)

completion(downloadedCountries, response, nil)
} catch {
print(error.localizedDescription)
completion(nil, response, error)
}
}.resume()
}
}

这给了我一个错误:

The data couldn’t be read because it isn’t in the correct format.

所以我的 Struct 似乎以某种方式不正确,但我不确定如何正确。谁能提供任何指导?我还有一些其他函数使用几乎相同的代码来获取 API JSON 数据并将其解码为结构……只是在这里遗漏了一些东西。

最佳答案

您提供的 JSON 格式不正确。

有效的 JSON:

[{"name":"Afghanistan"},{"name":"Åland Islands"},{"name":"Albania"},{"name":"Algeria"},{"name":"American Samoa"},{"name":"Andorra"},{"name":"Angola"},{"name":"Anguilla"},{"name":"Antarctica"},{"name":"Antigua and Barbuda"},{"name":"Argentina"}]

解析时,您需要使用[Country].self 而不仅仅是Country.self,即

do {
let downloadedCountries = try JSONDecoder().decode([Country].self, from: data)
print(downloadedCountries)
} catch {
print(error)
}

此外,也不需要struct CountryList。您可以删除它。

关于json - 解析一些 JSON 数据的问题 - Swift 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56463978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com