J'ai eu un problème avec l'analyse JSON dans Swift 4.2. Voici le code suivant qui montrait une erreur d'exécution.
Mes données Json sont les suivantes que j'ai reçues du serveur.
{
code: 406,
message: "Email Address already Exist.",
status: 0
}
J'utilise Codable pour créer ma structure comme suit
struct Registration: Codable {
var code: Int
var status: Int
private enum CodinggKeys: String, CodingKey {
case code
case status
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
self.code = Int(try container.decode(String.self, forKey: .code))!
} catch DecodingError.typeMismatch {
let value = try container.decode(Double.self, forKey: .code)
self.code = Int(value);
}
do {
self.status = try container.decode(Int.self, forKey: .status)
} catch DecodingError.typeMismatch {
let value = try container.decode(String.self, forKey: .status)
self.status = Int(value);
}
}
}
Mais chaque fois que j'ai une erreur sur l'analyse status key.
Remarque: j'avais essayé d'analyser l'état dans String, Int, Double, Decimal, NSInterger mais aucun ne fonctionne. chaque fois que j'ai la même erreur. Devrait décoder UInt mais a trouvé un nombre à la place.
Vous n'avez pas besoin d'implémenter votre propre initialiseur de décodage si les propriétés de votre structure sont déjà Decodable
. Vous n'avez pas non plus besoin de CodingKeys
personnalisé comme mentionné par @Gereon.
Pour les données JSON suivantes:
let data = """
{
"code": 406,
"message": "Email Address already Exist.",
"status": 0
}
""".data(using: .utf8)!
Cela fonctionne bien:
struct Registration: Codable {
var code: Int
var status: Int
}
if let registration = try? JSONDecoder().decode(Registration.self, from: data) {
print(registration.code) // 406
print(registration.status) // 0
}
Voir Types personnalisés d'encodage et de décodage de Apple pour plus d'informations.