通过使用 Alamofire 和解码获取 JSON - Swift 4

Posted

技术标签:

【中文标题】通过使用 Alamofire 和解码获取 JSON - Swift 4【英文标题】:Getting JSON by using Alamofire and decode - Swift 4 【发布时间】:2018-07-16 07:07:13 【问题描述】:

我有一个 API,我也想获得请求。 但我尝试使用 JSONDecoder 转换数据类型,但失败了。 我不知道如何像下面的数据一样解码这个 Json。 我想采用 json["response"] 内容设置我的用户结构。 对我有什么建议吗? 谢谢。

错误域 = NSCocoaErrorDomain 代码 = 4865 “没有与键 ID (“id”) 关联的值。”用户信息=NSCodingPath=( ), NSDebugDescription=没有与键 id ("id") 关联的值。

这是 JSON 数据:


"status": "success",
"response": 
"id": "1130f1e48b608f79c5f350dd",
"name": "Jack",
,
"errors": ""

enum RestfulAPI:String 
    case userInfo = "http://www.mocky.io/v2/5a796fb92e00002a009a5a49"

    func get(parameters:[String : Any]? = nil,success:@escaping (_ response : Data)->(), failure : @escaping (_ error : Error)->())
        let url = self.rawValue
        Alamofire.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON  (response) in
            switch response.result 
                case .success:
                if let data = response.data 
                    success(data)
                
                case .failure(let error):
                    failure(error)
            
       
        


struct User: Decodable 
    let id: String
    let name: String

用法:

RestfulAPI.userInfo.get(success:  data in
     do 
         let user = try JSONDecoder().decode(User.self, from: data)
         print("==) ", user.id, user.name)
     catch let error as NSError
         print(error)
     
 )  (error) in
        print(error)
 

【问题讨论】:

错误说明你做错了什么,请阅读 使用这个库来创建你的 JSON 模型类并进行解析。 github.com/insanoid/SwiftyJSONAccelerator 但我使用的是 Swift 4 【参考方案1】:

密钥id 不在您期望的级别。这就是错误消息的状态。 键 idname 位于键 response 的(子)字典中。

所以你需要一个伞形结构

struct Root : Decodable 
   let status: String
   let response: User


struct User: Decodable 
    let id: String
    let name: String

然后解码

let root = try JSONDecoder().decode(Root.self, from: data)
let user = root.response

【讨论】:

以上是关于通过使用 Alamofire 和解码获取 JSON - Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AlamoFire 搜索 JSON API 和解码数组

使用 Alamofire 解码 json 时出错

使用 Alamofire 将 JSON 解码为对象

使用 Struct 解码 JSON 响应的 Alamofire 错误

Swift 5 + Alamofire 5.*:解码顶部具有相同根对象的数据

Alamofire 获取请求和 JSON 响应(Yelp API)