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

Issues parsing some JSON Data - Swift 5

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

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

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

[{"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 的函数,然后通过完成处理程序获取数据并return它:

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.selfparsing,即

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

另外,没有struct CountryList的要求。你可以删除它。