Проблемы при разборе некоторых данных JSON - Swift 5 - PullRequest
0 голосов
/ 05 июня 2019

Я думаю, это будет просто, я полагаю, что я просто что-то упускаю из структуры 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()
    }
}

Это дает мне ошибку:

Данные не могут быть прочитаны, потому что они не в правильном формате.

Так что, похоже, мой Struct как-то не так, но я просто не уверен, как. Кто-нибудь может предложить какое-либо руководство? У меня есть несколько других функций, использующих практически идентичный код, который захватывает данные API JSON и декодирует их в структуры ... просто что-то здесь не хватает.

1 Ответ

1 голос
/ 05 июня 2019

Указанный вами 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 в то время как parsing, то есть

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

Кроме того, не требуется struct CountryList.Вы можете удалить это.

...