繁体   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