解析某些 JSON 数据时出现问题 - Swift 5



我认为这很简单,我假设我只是在这里缺少一些关于 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的要求。您可以删除它。

相关内容

  • 没有找到相关文章

最新更新