Невозможно разобрать файл JSON - PullRequest
0 голосов
/ 25 июня 2019

Я впервые работаю с JSON.У меня есть файл JSON, чтобы связать города и страны с часовыми поясами.Вот пример содержимого.

 [
 {
 "name": "Abidjan",
 "country": "Ivory Coast",
 "timeZoneName": "Africa/Bamako"
 },
 {
 "name": "Abu Dhabi",
 "country": "U.A.E.",
 "timeZoneName": "Asia/Dubai"
 }
]

Я пытаюсь использовать codable для разбора файла, но функция, которую я использую для разбора файла, не будет работать.У меня есть структура для каждого экземпляра в файле.

struct LoadedTimeZone: Codable {
    var name: String
    var country: String
    var timeZoneName: String
}

, и у меня есть структура для декодированного содержимого для загрузки непосредственно в

struct LoadedTimeZones: Codable {
    var results: [LoadedTimeZone]
}

В viewDidLoad моего UITableViewController, ядобавил этот код:

if let url = Bundle.main.url(forResource: "CitiesAndTimeZones", withExtension: "json") {
            if let data = try? Data(contentsOf: url) {
                parse(json: data)
            }
        }

и вот функция parse (json: Data)

 func parse(json: Data) {
    let decoder = JSONDecoder()

    if let jsonTimeZones = try? decoder.decode(LoadedTimeZones.self, from: json) {
        timeZones = jsonTimeZones.results
        tableView.reloadData()
    }
}

timeZones объявлена ​​как var timeZones = [LoadedTimeZone]() прямо над viewDidLoad.

Из некоторой отладки, которую я сделал, кажется, что jsonTimeZones возвращает ноль.Я рассмотрел несколько случаев на стеке потока и через Интернет, и то, что я сделал, кажется, не сильно отличается.

Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 25 июня 2019

Заменить

if let jsonTimeZones = try? decoder.decode(LoadedTimeZones.self, from: json) {

на

if let jsonTimeZones = try? decoder.decode([LoadedTimeZone].self, from: json) {

Ваш корень является массивом, и в вашем json

struct LoadedTimeZone: Codable {
    let name,country,timeZoneName: String 
}
нет ключа с именем results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...