Swift 4 Json Decoding, Какой метод является лучшим / последним, используя кодируемый или декодируемый? - PullRequest
0 голосов
/ 02 ноября 2018

В Swift 4.1 мы можем декодировать JSON так:

struct Person: Decodable {
    let id: Int
    let name: String
    let imageUrl: String
}

let people = [Person]()

func parseJSON(data: Data) {
    do {
        let decoder = JSONDecoder()
        decoder.keyDecodingStratergy = .convertFromSnakeCase
        self.people = try decoder.decode([Person].self, from: data)
    } catch let error {
        print(error as? Any)
    }
}

Q1. Какая разница, если я использую Codable вместо Decodable? Что лучше?

Q2. Как использовать decodeIfPresent здесь?

Q3. Как декодировать, если в JSON нет key?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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


По первому вопросу: Codable - это протокол, расширяющий Encodable и Decodable.

Декодируемый предназначен для анализа данных ваших моделей. Например, из данных JSON в структуры.

Кодируемый предназначен для получения данных из ваших моделей.

Кодируемый содержит оба.

0 голосов
/ 02 ноября 2018

Лучший способ кодировать и декодировать 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/

...