Как использовать Codable для анализа Json

#ios #json #swift

Вопрос:

Каждый раз, когда я пытаюсь использовать код, способный анализировать json, я всегда сталкиваюсь с проблемой, связанной с тем, что в моем представлении таблицы или коллекции не отображаются данные. Возьмем, к примеру, приведенный ниже код; Я подключаюсь к newsAPI, чтобы отобразить поле «заголовок» в моем табличном представлении. У меня есть моя модель данных, установленная вместе с сетевым кодом в функции запроса. При запуске кода он не показывает значения; Как это исправить ? ссылка на проект:https://github.com/lexypaul13/Наса

 struct ArticleData:Codable{
    var status: String
    var totalResults: String
    var article: [Article]
}
struct Article: Codable {
    var title:String?
    var unwrappeTitle:String{
        return "(title ?? "No value")"
    } 
}



     func request(){
        
        let website = "https://newsapi.org/v2/everything?q=teslaamp;from=2021-05-21amp;sortBy=publishedAtamp;apiKey=d32071cd286c4f6b9c689527fc195b03"
        if let url = URL.init(string: website){
             let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error)  in
                if  let data = data{
                do {
                    let parsedJsons = try? JSONDecoder().decode(ArticleData.self, from: data )
                    DispatchQueue.main.async {
                        self.information = parsedJsons?.article ?? []
                        self.tableView.reloadData()
                    }
                }catch{
                    print(error)
                }
                }
            })
            task.resume()
        }
    }
 

Комментарии:

1. Откуда вы взяли код? Какой бы пример ни рекомендовал использовать try? , его необходимо найти и исправить.

Ответ №1:

Вы должны изменить свое try? значение на try так, чтобы ваш catch блок вызывался при ошибке декодирования, и вы получите полезный вывод.

Как только вы это сделаете и ошибки декодирования будут напечатаны, вы увидите, что у вашей ArticleData структуры есть пара проблем , а именно, что totalResults она должна быть Int не a String и article должна быть переименована в articles :

 struct ArticleData: Codable{
    var status: String
    var totalResults: Int
    var articles: [Article]
}
 

Комментарии:

1. Хотел бы я знать, какой учебник или пример используют люди, которые советуют им использовать try ? , чтобы мы могли выследить его и убить! 99% Codable вопросов можно было бы избежать, если бы люди использовали try и печатали полезную ошибку, которую предоставляет декодер.

2. Спасибо вам за помощь. Чтобы уточнить, переменные в данных статьи структуры должны иметь тип и имя как сам json, правильно ?

3.@MayowaPaul Это правильно. Если вы хотите использовать для свойств другие имена, чем в JSON, ваша структура может включать перечисление, соответствующее протоколу CodingKeys, для получения дополнительной информации см. раздел «Выбор свойств для кодирования и декодирования с использованием ключей кодирования » здесь.