Не могу распарсить данные JSON

json

#21

Спасибо, приму к сведению.


#22

Т.е. ошибка на сервере, из-за кривых кавычек «animal_about"…
Не повезло вам с backend’ом


#23

Еще по вашему примеру разобрался, как достать фотографию.
Тоже сделал промежуточный класс. Оставлю код, может кому пригодится:

Как распарсить:

class AnimalData: Codable {
    let animalName: String
    let animalAbout: String
    let animalImage: AnimalImage

    init(animal_title: String, animal_about: String, animal_image: AnimalImage){
        self.animalName = animal_title
        self.animalAbout = animal_about
        self.animalImage = animal_image

    }
    
    private enum CodingKeys: String, CodingKey {
        case animalName = "animal_title"
        case animalAbout = "animal_about"
        case animalImage = "animal_image"

    }
    

}

class AnimalImage: Codable{

    let alt: String
    let src: String

    init(alt: String,src: String){
        self.alt = alt
        self.src = src
    }

    private enum CodingKeys: String, CodingKey {
        case alt = "alt"
        case src = "src"
    }
    
}

И как из это выложить в TableView:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell else { return UITableViewCell() }

       cell.name.text = "Name: " + animals[indexPath.row].animal.animalName
        
        cell.about.text = "About: " + animals[indexPath.row].animal.animalAbout
        
        if let imageURL = URL(string: animals[indexPath.row].animal.animalImage.src) {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: imageURL)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        cell.img.image = image
                    }
                }
            }
        }

        return cell
 }

#24

Еще маленький совет дам:
1 - что бы не обращаться каждый раз в массив animals[indexPath.row], сделайте переменную
let animal = animals[indexPath.row].animal

2 - всю логику по заполнению ячейки, лучше всего вынести в CustomCell. Сделайте там метод, что-то вроде

func bind(to model: AnimalData) {
    тут уже заполняете элементы ячейки данными + загрузка картинки
}

И тогда контроллер будет смотреться элегантнее и проще

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell else { return UITableViewCell() }
        let animal = animals[indexPath.row].animal

        cell.bind(to: animal)

        return cell
 }