Swift 4 parsing JSON проблема понимания


#1

Помогите пожалуйста разобраться и понять парсинг JSON

Задача стоит получить необходимы данные с сайта https://randomuser.me/api/ и запихнуть в таблицу
Основной проблемой для себя я вижу непонимание как сформировать структуры и ими пользоваться при парсинге. :triumph: Вот что у меня получилось, но выдает ошибку typeMismatch, на что документация говорит Неправильный тип получаемых данных.

Структуры

struct Welcome: Codable {
    let results: [Result]?
    let info: Info?
}

struct Info: Codable {
    let seed: String?
    let results, page: Int?
    let version: String?
}

struct Result: Codable {
    let gender: String?
    let name: Name?
    let location: Location?
    let email: String?
    let login: Login?
    let dob, registered: Dob?
    let phone, cell: String?
    let id: ID?
    let picture: Picture?
    let nat: String?
}

struct Dob: Codable {
    let date: Date?
    let age: Int?
}

struct ID: Codable {
    let name, value: String?
}

struct Location: Codable {
    let street, city, state: String?
    let postcode: Int?
    let coordinates: Coordinates?
    let timezone: Timezone?
}

struct Coordinates: Codable {
    let latitude, longitude: String?
}

struct Timezone: Codable {
    let offset, description: String?
}

struct Login: Codable {
    let uuid, username, password, salt: String?
    let md5, sha1, sha256: String?
}

struct Name: Codable {
    let title, first, last: String?
}

struct Picture: Codable {
    let large, medium, thumbnail: String?
}

Парсинг

let jsonUrlString = “https://randomuser.me/api/
guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        
        
        guard let data = data else { return }
        
        do {
            let json = try JSONDecoder().decode(Welcome.self, from: data)
            print(json)
            
        } catch DecodingError.dataCorrupted(let context) {
            print(DecodingError.dataCorrupted(context))
        } catch DecodingError.keyNotFound(let key, let context) {
            print(DecodingError.keyNotFound(key,context))
        } catch DecodingError.typeMismatch(let type, let context) {
            print(DecodingError.typeMismatch(type,context))
        } catch DecodingError.valueNotFound(let value, let context) {
            print(DecodingError.valueNotFound(value,context))
        } catch let error{
            print(error)
        }
        
        }
    .resume()

Ошибка

typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: “results”, intValue: nil), _JSONKey(stringValue: “Index 0”, intValue: 0), CodingKeys(stringValue: “dob”, intValue: nil), CodingKeys(stringValue: “date”, intValue: nil)], debugDescription: “Expected to decode Double but found a string/data instead.”, underlyingError: nil))


#2
struct Dob: Codable {
    let date: String?
    let age: Int?
}

У вас в ошибке конкретно написано с каким полем проблема.


#3

Спасибо! Заработало :slightly_smiling_face: