Лучший способ кодировать и декодировать JSON в Swift4
Вот JSON-представление простого объекта User, давайте посмотрим, как десериализовать эти данные в объект.
{
"id": 13,
"firstname" : "John",
"lastname" : "Doe",
"email" : "john.doe@lost.com"
}
Декодирование JSON в объект
Я использую тип структуры для представления моего объекта и включаю протокол Decodable, чтобы разрешить десериализацию.
struct User : Decodable {
let id : Int
let firstname : String
let lastname : String
let email : String
}
Теперь мы готовы декодировать его с помощью JSONDecoder.
// при условии, что наши данные поступают со стороны сервера
let jsonString = "{ \"id\": 13, \"firstname\" : \"John\", \"lastname\" : \"Doe\", \"email\" : \"john.doe@lost.com\" }"
let jsonData = jsonString.data(using: .utf8)!
do {
let jsonDecoder = JSONDecoder()
let user = try jsonDecoder.decode(User.self, from: jsonData)
print("Hello \(user.firstname) \(user.lastname)")
} catch {
print("Unexpected error: \(error).")
}
Довольно просто, верно? Давайте посмотрим, как это сериализовать сейчас.
Кодирование объекта в JSON
Во-первых, нам нужно обновить нашу структуру, чтобы разрешить кодирование. Для этого нам просто нужно включить протокол Encodable.
struct User : Encodable, Decodable {
...
}
Наш объект готов к сериализации обратно в JSON. Мы следуем тому же процессу, что и раньше, на этот раз используя JSONEncoder. В этом случае я также преобразую данные в строку, чтобы убедиться, что они работают
// при условии, что у нас есть объект для сериализации
Это все еще довольно просто! Так что же такое Codable?
Ну, Codable, это просто псевдоним Encodable и Decodable протоколов, как вы можете видеть в его определении
public typealias Codable = Decodable & Encodable
Если вы не хотите, чтобы ваши ключи JSON управляли вашими именами, вы все равно можете настроить их с помощью CodingKeys. Описанный как enum, он будет автоматически выбран при кодировании / декодировании
struct User : Codable {
var id : Int
var firstname : String
var lastname : String
var email : String?
// keys
private enum CodingKeys: String, CodingKey {
case id = "user_id"
case firstname = "first_name"
case lastname = "family_name"
case email = "email_address"
}
}
идти дальше
https://medium.com/@phillfarrugia/encoding-and-decoding-json-with-swift-4-3832bf21c9a8
https://benoitpasquier.com/encoding-decoding-json-swift4/
Ответ на вопрос 3: https://www.calhoun.io/how-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided/