Swift Codable: включите enum Coding Keys, если API может добавить больше свойств для ответа JSON в будущем - PullRequest
0 голосов
/ 20 сентября 2019

Я использую Codable для анализа моего JSON объекта ответа.

Целесообразно ли включать enum CodingKeys: String, CodingKey, так что в будущем, если к объекту ответа JSON будут добавлены дополнительные свойства,это, они будут проигнорированы и не вызовут сбой?

Это просто много дополнительного кода для обратной засыпки, когда у вас есть 30 различных моделей в приложении.

Не уверен, есть ли способлучший способ справиться с этим?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Ниже приведен пример, который работает нормально и доказывает, что дополнительные ключи json, которые не определены в структуре, будут игнорироваться

let data = """
 { "id": 32, "name" : "abc", "other": "gbdfb"}
""".data(using: .utf8)!

struct JSONData: Decodable {
    let id: Int
    let name: String
}


do {
    let result = try JSONDecoder().decode(JSONData.self, from: data)
    print(result)
} catch {
    print(error)
}
1 голос
/ 20 сентября 2019

Ответ No. Codable декодирует только значения, найденные в json.Более того, нет необходимости, если вы добавляете enum CodingKeys: String, CodingKey к каждому Codable протоколу.Вы можете оставить это с нулевым значением.

Мы используем для записи enum CodingKeys: String, CodingKey, если ключ не является змеиным.Но у Codable есть свои keyDecodingStrategy


let jsonString = """
[
    {
        "profile_name": "Ankur Lahiry",
    },
    {
        "profile_name": "Karim Rahman",
    }
]
"""

let jsonData = Data(jsonString.utf8)


struct Name : Codable {
    var profileName: String?
}


let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase // will solve enum CodingKeys: String, CodingKey issue 
do {
    let names = try decoder.decode([Name].self, from: jsonData)
    print(names)
} catch {
    print("error")
}

...