neo*_*neo 2 json ios swift codable
我有一些来自服务器的JSON响应。成功的情况下,可能是这样的:
{
"success": true,
"data": [
{
/// something here
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果所有服务器响应都将成功,那么解析该JSON真的很容易。但是我们也有失败案例,例如:
{
"success": false,
"msg": "Your session expired",
"end_session": true
}
Run Code Online (Sandbox Code Playgroud)
这意味着我们需要处理两种情况。如您所注意到的,类似的属性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"
}
}
Run Code Online (Sandbox Code Playgroud)
如果响应成功或不成功,它可能包含一些数据,可以识别出发生错误的原因(使用successattribute或msg)。解析过程如下:
let model = try JSONDecoder().decode(RegularResponse<MyModel>.self, from: data)
if model.success {
// do something with data
} else {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但是如果遵循以下JSON会怎样:
{
"success": true,
"name": "Jon Snow",
"living_place": "Nights Watch",
//some other fields
}
Run Code Online (Sandbox Code Playgroud)
在这里,我没有data属性。这意味着,我RegularResponse无法被解析。那么,问题是如何处理这种情况?解决方案的想法很简单:总是将成功案例中的数据放入dataAPI的字段中。这样,RegularResponse无论内部是什么,我都将始终工作data。但是,它需要在服务器端进行更改。可以将其固定在客户端,而不更改服务器端吗?换句话说,如何使用Codable处理Swift中的上述情况?
我不确定这是否是最好的解决方案,但是如果您知道您的错误响应处于这种状态,即:
{
"success": false,
"msg": "Some error",
"end_session": "true",
}
Run Code Online (Sandbox Code Playgroud)
那么您可以根据此响应创建另一个Codable结构/类。
struct ErrorResponse: Codable {
let success: Bool
let msg: String
let end_session: String
}
Run Code Online (Sandbox Code Playgroud)
然后在响应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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |