我认为这很简单,我假设我只是在这里缺少一些关于 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()
}
}
这给了我一个错误:
无法读取数据,因为它的格式不正确。
所以似乎我的结构不正确,但我只是不确定如何。任何人都可以提供任何指导吗?我还有其他一些使用几乎相同的代码的函数来获取 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
,而不仅仅是在parsing
时使用Country.self
,即
do {
let downloadedCountries = try JSONDecoder().decode([Country].self, from: data)
print(downloadedCountries)
} catch {
print(error)
}
此外,没有struct CountryList
的要求。您可以删除它。