【发布时间】:2019-12-04 18:20:56
【问题描述】:
如何使用 Codable 访问 JSON。这是我的示例 json。
{
"status": "success",
"message": "Data received successfully",
"course": {
"id": 1,
"description": "something",
"name": "ielts",
"attachments": [
{
"id": 809,
"attachment": "https:--",
"file_name": "syllabus.pdf",
"description": "course",
},
{
"id": 809,
"attachment": "https:--",
"file_name": "syllabus.pdf",
"description": "course",
}]
"upcased_name": "IELTS"
}
}
这是我的代码。
struct ResponseObject: Codable {
let course: [Course]
}
struct Course: Codable {
let id: Int
let name: String
let description: String
let attachments: [Attachments]
}
struct Attachments: Codable {
let id: Int
let attachment: String
let file_name: String
let description: String
let about: String
}
var course: [Course] = []
这是我的 api 调用。
func fetchUserData() {
let headers: HTTPHeaders = [
"Authorization": "Token token="+UserDefaults.standard.string(forKey: "auth_token")!,
"Accept": "application/json"
]
let params = ["course_id" : "1"] as [String : AnyObject]
self.showSpinner("Loading...", "Please wait!!")
DispatchQueue.global(qos: .background).async {
AF.request(SMAConstants.courses_get_course_details , parameters: params, headers:headers ).responseDecodable(of: ResponseObject.self, decoder: self.decoder) { response in
DispatchQueue.main.async {
self.hideSpinner()
guard let value = response.value else {
print(response.error ?? "Unknown error")
return
}
self.course = value.course
}
}
}
}
}
我收到以下错误。
responseSerializationFailed(原因: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(错误: Swift.DecodingError.typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "course", intValue: nil)], debugDescription: "预计解码 数组,但找到了字典。”,基础错误:无))))
【问题讨论】:
-
请阅读错误信息。
course的值不是数组,而是字典(单个对象)。而且Attachment中没有about键 -
您应该测试较小的代码片段;例如,在这里,当您进行 API 调用时,您会发现您的 Codable 内容已损坏。如果相反,例如,您在项目中包含一些测试 JSON,然后通过从包中加载它来对其进行解码,那么一旦您确定可以继续进行 API 调用,这将非常有帮助。
标签: json swift alamofire codable