Swift 4 - parsing JSON (Codable)

json

#1

привет читающим! К сожалению не всегда всё бывает гладко. Так получилось, что хотелось бы распарсить с новым протоколом Codable JSON формат. То, что нужно распарсить, оставляет желать лучшего… Вообщем вот оно…

let stringJSON = """
{
"fields":[[
    {
    "first_name":"Jim"
    },{
    "last_name":"Carry"
    }

    ]]
}
"""

я как бы пытался сделать так:

struct NamenList : Decodable {
    let fields: [[Fields]]
}

struct Fields: Decodable {
    var firstName: String
    var lastName: String

    enum CodingKeys: String, CodingKey {
        case fields
    }

    enum FirstNameKeys: String, CodingKey {
        case firstName = "first_name"
    }

    enum LastNameKeys: String, CodingKey {
        case lastName = "last_name"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)

        let fieldsFirstName = try values.nestedContainer(keyedBy: FirstNameKeys.self, forKey: .fields)
        firstName = try fieldsFirstName.decode(String.self, forKey: .firstName)

        let fieldsLastName = try values.nestedContainer(keyedBy: LastNameKeys.self, forKey: .fields)
        lastName = try fieldsLastName.decode(String.self, forKey: .lastName)

    }
}

let data = jsonString.data(using: .utf8)!
do {
    let blogs = try JSONDecoder().decode(NamenList.self, from: data)
    dump (blogs)
} catch let jsonErr {
    print("Error serializing json", jsonErr)
}

#2

https://quicktype.io - сайт, который строит классы/структуры на основе JSON данных


#3

Ёмаё, дружище, что могу сказать, ГРОМАДНОЕ СПАСИБО!


#4

Вот ещё один хороший сайт
http://www.json4swift.com
Спасибо @RexHunt


#5

Да, классный сайт, сразу добавил в свои фавориты. Спасибо!


#6

Я бы советовал самостоятельно разобраться с Codable и не пользовался сайтами с сомнительной пользой, если что то пойдет не так, сайт не поможет :slight_smile:

let json = """
{
"fields":[[
    {
    "first_name":"Jim"
    },{
    "last_name":"Carry"
    }

    ]]
}
"""

struct Field: Codable { let firstName, lastName: String? }

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let fields = (try? decoder.decode([String: [[Field]]].self, from: json.data(using: .utf8)!)).flatMap { $0["fields"] }
print(fields)

#7

да конечно, что говорить, это надо на зубок знать. Но как всомогалка тоже что то на первое время нужно. За дикодировку благодарю, всего пару строк, супер!