解析某些JSON数据时出现问题-Swift 5
我想这很简单,我想我只是缺少了一些关于JSON结构的东西。我有一些代码可以从API句柄中提取一些数据,以获得国家名称列表: 以下是API数据示例,但请使用上面的链接查看:解析某些JSON数据时出现问题-Swift 5,json,swift,codable,Json,Swift,Codable,我想这很简单,我想我只是缺少了一些关于JSON结构的东西。我有一些代码可以从API句柄中提取一些数据,以获得国家名称列表: 以下是API数据示例,但请使用上面的链接查看: [{"name":"Afghanistan"},{"name":"Åland Islands"},{"name":"Albania"},{"name":"Algeria"},{"name":"American Samoa"},{"name":"Andorra"},{"name":"Angola"},{"name":"Angu
[{"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,而不仅仅是Country.self
,即
do {
let downloadedCountries = try JSONDecoder().decode([Country].self, from: data)
print(downloadedCountries)
} catch {
print(error)
}
此外,不需要使用struct CountryList
。您可以删除它。永远不要打印(错误。本地化描述)
。打印错误
实例。很抱歉,在我正要去吃午饭的时候,我很快复制了JSON片段,但忘了添加结尾]。使用Country[Country].self的数组。为什么我不能使用一个变量[Country]的附加结构countryList?@EdwardS。结构始终表示字典。没有键为国家/地区的词典。根对象是一个数组。