example json swift codable

json - example - swift codable dictionary



Cómo excluir propiedades del código de Swift 4 (4)

Los nuevos protocolos Encodable / Encodable Swfit 4 hacen que la serialización (de) JSON sea bastante agradable. Sin embargo, todavía no he encontrado una manera de tener un control detallado sobre qué propiedades deben codificarse y cuáles deben decodificarse.

He notado que excluir la propiedad de la enumeración CodingKeys adjunta excluye la propiedad del proceso por completo, pero ¿hay alguna manera de tener un control más detallado?


He utilizado el protocolo y su extensión junto con AssociatedObject para establecer y obtener la imagen (o cualquier propiedad que deba excluirse de la propiedad Codificable).

Con esto no tenemos que implementar nuestro propio codificador y decodificador

Aquí está el código, manteniendo el código relevante por simplicidad:

protocol SCAttachmentModelProtocol{ var image:UIImage? {get set} var anotherProperty:Int {get set} } extension SCAttachmentModelProtocol where Self: SCAttachmentUploadRequestModel{ var image:UIImage? { set{ //Use associated object property to set it } get{ //Use associated object property to get it } } } class SCAttachmentUploadRequestModel : SCAttachmentModelProtocol, Codable{ var anotherProperty:Int }

Ahora, cada vez que queramos acceder a la propiedad Image podemos usarla en el objeto que confirma el protocolo (SCAttachmentModelProtocol)


La lista de claves para codificar / decodificar está controlada por un tipo llamado CodingKeys . El compilador puede sintetizar esto para usted, pero siempre puede anularlo.

Digamos que no desea codificar / decodificar el nickname la propiedad:

struct Person: Codable { var firstName: String var lastName: String var nickname: String? private enum CodingKeys: String, CodingKey { case firstName case lastName } }

Esto excluirá el nickname en la codificación y decodificación.

Si desea que sea asimétrico (es decir, codificar pero no decodificar o viceversa), debe proporcionar sus propias implementaciones de encode(with encoder: ) init(from decoder: ) e init(from decoder: ) :

struct Person: Codable { var firstName: String var lastName: String // Since fullName is a computed property, it''s excluded by default var fullName: String { return firstName + " " + lastName } private enum CodingKeys: String, CodingKey { case firstName case lastName case fullName } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) firstName = try container.decode(String.self, forKey: .firstName) lastName = try container.decode(String.self, forKey: .lastName) } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(firstName, forKey: .firstName) try container.encode(lastName, forKey: .lastName) try container.encode(fullName, forKey: .fullName) } }


Si bien esto se puede hacer, en última instancia, termina siendo muy intransigente e incluso no JSONy . Creo que veo de dónde vienes, el concepto de #id s prevalece en HTML, pero rara vez se transporta al mundo de JSON lo que considero algo bueno (TM).

Algunas estructuras Codable podrán analizar su archivo JSON muy bien si lo reestructura usando hashes recursivos, es decir, si su recipe solo contiene una variedad de ingredients que a su vez contiene (uno o varios) ingredient_info . De esta forma, el analizador lo ayudará a unir su red en primer lugar y solo tendrá que proporcionar algunos vínculos de retroceso a través de un recorrido simple de la estructura si realmente los necesita . Dado que esto requiere una revisión exhaustiva de su JSON y su estructura de datos, solo esbozo la idea para que lo piense. Si lo considera aceptable, dígame en los comentarios, entonces podría elaborarlo más, pero dependiendo de las circunstancias, es posible que no tenga la libertad de cambiar ninguno de ellos.


Si necesitamos excluir la decodificación de un par de propiedades de un gran conjunto de propiedades en la estructura, declararlas como propiedades opcionales. El código para desenvolver opciones es menos que escribir muchas claves en CodingKey enum.