簡體   English   中英

如何使用 Codable 處理 JSON 響應的失敗案例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM