Расшифровка JSON в Swift 4 - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю с Руководством по разработке приложений Apple, и это код, с которым я работаю сейчас ...

struct CategoryInfo: Codable {
    var category: String
    var description: String
    var logo: String
    var mobileCategoryName: String

    enum Keys: String, CodingKey {
        case category
        case description = "descr"
        case logo
        case mobileCategoryName = "mobileCatName"
    }

    init(from decoder: Decoder) throws {
        let valueContainer = try decoder.container(keyedBy: Keys.self)
        self.category = try valueContainer.decode(String.self, forKey: Keys.category)
        self.description = try valueContainer.decode(String.self, forKey: Keys.description)
        self.logo = try valueContainer.decode(String.self, forKey: Keys.logo)
        self.mobileCategoryName = try valueContainer.decode(String.self, forKey: Keys.mobileCategoryName)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    let categories = Industry_TableViewController()
    categories.fetchCategoryInfo { (category) in
        if let category = category {
            print(category)
        }
    }
}

func fetchCategoryInfo(completion: @escaping(CategoryInfo?) -> Void) {
    let url = URL(string: "XXXXX")!        
    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        let jsonDecoder = JSONDecoder()
        if let data = data,
            let category = try? jsonDecoder.decode(CategoryInfo.self, from: data) {
                completion(category)
            } else {
                print("Nothing reutrned or Not decoded")
                completion(nil)
            }
    }
    task.resume()
}

работает нормально, когда мой возвращенный JSON находится в следующем формате ...

{"category":"Excavators","descr":"Compact, Mid-Sized, Large, Wheeled, Tracked...","logo":"excavators","mobileCatName":"Excavators"}

Моя структура создана, и все переменные заполнены правильно. Но API не возвращает одну категорию за раз, а возвращает несколько, например ...

[{"category":"Aerial Lifts","descr":"Aerial Lifts, Man Lifts, Scissor Lifts...","logo":"aeriallifts","mobileCatName":"Aerial Lifts"},{"category":"Aggregate Equipment","descr":"Crushing, Screening, Conveyors, Feeders and Stackers...","logo":"aggregateequipment","mobileCatName":"Aggregate"},{"category":"Agricultural Equipment","descr":"Tractors, Harvesters, Combines, Tillers...","logo":"agricultural","mobileCatName":"Agricultural"}]

И я врезаюсь в стену, пытаясь понять, как правильно это декодировать. Я прошел так много маршрутов, что даже не знаю, что искать. Может кто-нибудь помочь или указать мне направление.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вам нужно изменить свою функцию для анализа массива категорий вместо одной. Вам просто нужно передать метатип Array<CategoryInfo> в функцию decode и изменить сигнатуру функции так, чтобы обработчик завершения также возвращал массив.

func fetchCategoryInfo(completion: @escaping ([CategoryInfo]?) -> Void) {
    let url = URL(string: "XXXXX")!        
    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        let jsonDecoder = JSONDecoder()
        if let data = data,
            let categories = try? jsonDecoder.decode([CategoryInfo].self, from: data) {
                completion(categories)
            } else {
                print("Nothing reutrned or Not decoded")
                completion(nil)
            }
    }
    task.resume()
}
0 голосов
/ 05 ноября 2018

попробовать? jsonDecoder.decode ([CategoryInfo] .self, from: data)

...