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をデコードすることが期待されていましたが、代わりに数値が見つかりました。
構造体のプロパティがすでに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を参照してください。