![](/img/trans.png)
[英]How to load JSON response with codable structure into tableview using Swift 4.2?
[英]How to handle failure cases of JSON response using Codable?
我有一些來自服務器的 JSON 響應。 在成功的情況下,它可能是這樣的:
{
"success": true,
"data": [
{
/// something here
}
]
}
如果所有服務器響應都成功,那么解析 JSON 將非常容易。 但我們也有失敗案例,例如:
{
"success": false,
"msg": "Your session expired",
"end_session": true
}
這意味着我們需要處理兩種情況。 正如您所注意到的,諸如success, msg
類的屬性可能出現在任何響應中。 為了處理這個問題,我創建了以下結構:
struct RegularResponse<T: Codable>: Codable {
let success: Bool
let msg: String?
let endSession: Bool?
let data: T?
enum CodingKeys: String, CodingKey {
case success, msg, data
case endSession = "end_session"
}
}
如果響應成功或不成功,它可能包含一些數據,可以確定錯誤發生的原因(使用success
屬性或msg
)。 解析過程將 go 如下所示:
let model = try JSONDecoder().decode(RegularResponse<MyModel>.self, from: data)
if model.success {
// do something with data
} else {
// handle error
}
一切正常,但如果遵循 JSON 如下:
{
"success": true,
"name": "Jon Snow",
"living_place": "Nights Watch",
//some other fields
}
在這里,我沒有data
屬性。 這意味着,我的RegularResponse
無法解析。 那么,問題是如何處理這些情況? 我的解決方案很簡單:始終將成功案例中的數據放入我的 API 的data
字段中。 通過這樣做,我的RegularResponse
將始終有效,無論內部data
是什么。 但是,它需要在服務器端進行更改。 這可以在客戶端修復,而不是更改服務器端嗎? 換句話說,如何使用 Codable 處理 Swift 中的上述情況?
我不確定這是否是最好的解決方案,但如果您知道您的錯誤響應是這種形狀,即:
{
"success": false,
"msg": "Some error",
"end_session": "true",
}
那么你可以在這個響應之后創建另一個 Codable 結構/類。
struct ErrorResponse: Codable {
let success: Bool
let msg: String
let end_session: String
}
然后當您響應您的 JSON 時,您可以將代碼調整為:
if let successResponse = try? JSONDecoder().decode(RegularResponse<MyModel>.self, from: data) {
//handle success
} else if let responseError = try? JSONDecoder().decode(ErrorResponse.self, from data) {
//handle your error
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.