web-dev-qa-db-fra.com

Devrait décoder Int mais a trouvé un nombre à la place

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.

7
Jatin Chauhan

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.

1
dnlggr