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

解析某些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

我想这很简单,我想我只是缺少了一些关于JSON结构的东西。我有一些代码可以从API句柄中提取一些数据,以获得国家名称列表:

以下是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,而不仅仅是
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。结构始终表示字典。没有键为
国家/地区的词典。根对象是一个数组。