使用 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 swift 4.0 中使用 Alamofire/SwiftyJSON 时出错
使用 Struct 解码 JSON 响应的 Alamofire 错误
如何使用 Alamofire 和 Swift Decode 从 JSON 解码和访问 Double