使用 Alamofire 解码 json 时出错

Posted

技术标签:

【中文标题】使用 Alamofire 解码 json 时出错【英文标题】:errors decoding json with Alamofire 【发布时间】:2018-08-14 09:00:23 【问题描述】:

我尝试使用 Alamofire 解码来自网络的 JSON 数据。我的应用发送相同的 GET 请求,但 id 不同。有的 JSON 解码成功,有的无法解码。可能是什么问题?我该如何解决这个问题?所有响应均由 JSON 验证器检查并且有效。尝试使用 URLSession.shared.dataTask(with: url) 解码只是无法解码单个响应,即使是使用 Alamofire 成功解码的响应

代码是:

var hostURL = "https://public-api.nazk.gov.ua/v1/declaration/"
    hostURL = hostURL + declarationID
    print(hostURL)

    Alamofire.request(hostURL).responseData  response in
        switch response.result 
        case .success(let data):
            let declarationInfoElement = try? JSONDecoder().decode(DeclarationInfoElement.self, from: data)
            print(declarationInfoElement)
        case .failure:
            print("fail")
        
    

控制台输出为:

https://public-api.nazk.gov.ua/v1/declaration/3509369f-b751-444a-be38-dfa66bb8728f
https://public-api.nazk.gov.ua/v1/declaration/3e7ad106-2053-48e4-a5d2-a65a9af313be
https://public-api.nazk.gov.ua/v1/declaration/743b61d5-5082-409f-baa0-9742b4cc2751
https://public-api.nazk.gov.ua/v1/declaration/5d98b3d9-8ca6-4d5d-b39f-e4de98d451aa
https://public-api.nazk.gov.ua/v1/declaration/7e3c488c-4d6a-49a3-aefb-c760f317dca4


nil
Optional(Customs_UA.DeclarationInfoElement(id: "4647cd5d-5877-4606-8e61-5ac5869b71e0")
nil
nil
nil

【问题讨论】:

【参考方案1】:
@objc func getJSON()
    let hostURL = "https://public-api.nazk.gov.ua/v1/declaration/"

    print(hostURL)

    Alamofire.request(hostURL).responseData  response in
        switch response.result 
        case .success(let data):

            do 
                if let json = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? Dictionary<String,Any>
                

                    print(json)

                 else 
                    print("bad json")
                
             catch let error as NSError 
                print(error)
            

            print(data)
        case .failure:
            print("fail")
        
    

【讨论】:

【参考方案2】:

问题在于 JSON 的某些参数是可选的。您必须发布您的 DeclarationInfoElement 类进行检查。

使用类似的方法来检测错误。

   class DeclarationInfoElement: Decodable 
        let id: String?
        let created_date: String?
/// and so on
    

【讨论】:

以上是关于使用 Alamofire 解码 json 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 将 JSON 解码为对象

在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错

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

如何使用 Alamofire 和 Swift Decode 从 JSON 解码和访问 Double

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

我在 Swift 5 上解码 json 时出错