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.