热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

如何使用Codable处理JSON响应的失败案例?

如何解决《如何使用Codable处理JSON响应的失败案例?》经验,为你挑选了1个好方法。

我有一些来自服务器的JSON响应。成功的情况下,可能是这样的:

{
  "success": true, 
  "data": [
    {
       /// something here 
    }
  ]
}

如果所有服务器响应都将成功,那么解析该JSON真的很容易。但是我们也有失败案例,例如:

{
  "success": false, 
  "msg": "Your session expired",
  "end_session": true 
}

这意味着我们需要处理两种情况。如您所注意到的,类似的属性success, msg可能出现在任何响应中。为了解决这个问题,我创建了以下结构:

struct RegularResponse: 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"
}

}

如果响应成功或不成功,它可能包含一些数据,可以识别出发生错误的原因(使用successattribute或msg)。解析过程如下:

let model = try JSONDecoder().decode(RegularResponse.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无法被解析。那么,问题是如何处理这种情况?解决方案的想法很简单:总是将成功案例中的数据放入dataAPI的字段中。这样,RegularResponse无论内部是什么,我都将始终工作data。但是,它需要在服务器端进行更改。可以将其固定在客户端,而不更改服务器端吗?换句话说,如何使用Codable处理Swift中的上述情况?



1> 小智..:

我不确定这是否是最好的解决方案,但是如果您知道您的错误响应处于这种状态,即:

{
  "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.self, from: data) {
    //handle success
} else if let respOnseError= try? JSONDecoder().decode(ErrorResponse.self, from data) {
    //handle your error
}


推荐阅读
author-avatar
半宅半学
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有