web-dev-qa-db-ja.com

Intをデコードする予定でしたが、代わりに数値が見つかりました

Swift 4.2。でJSON解析に問題がありました。ランタイムエラーを示す次のコードは次のとおりです。

私のJsonデータは、サーバーから取得した次のとおりです。

{
    code: 406,
    message: "Email Address already Exist.",
    status: 0
}

Codableを使用して次のように構造を作成しています

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);
        }
    }
} 

しかし、解析中にエラーが発生するたびにstatus keyになります。

注:私はString、Int、Double、Decimal、NSIntergerでステータスを解析しようとしましたが、どちらも機能しません。同じエラーが発生するたびに。 UIntをデコードすることが期待されていましたが、代わりに数値が見つかりました。

7
Jatin Chauhan

構造体のプロパティがすでにDecodableである場合は、独自のデコード初期化子を実装する必要はありません。 @Gereonで言及されているように、カスタムCodingKeysも必要ありません。

次のJSONデータの場合:

let data = """
    {
        "code": 406,
        "message": "Email Address already Exist.",
        "status": 0
    }
    """.data(using: .utf8)!

これはうまくいきます:

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
}

詳細は カスタム型のエンコードとデコード from Appleを参照してください。

1
dnlggr