我想解析一个json但Xcode显示此消息: keyNotFound(CodingKeys(stringValue:“ Id”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有关联的值键为CodingKeys(stringValue:\“ Id \”,intValue:nil)(\“ Id \”)。“,底层错误:nil))
JSON:
{
"result": [
{
"Id": 5,
"Title": "Test1",
"EnTitle": "Story and Novel"
},
{
"Id": 38,
"Title": "Test2",
"EnTitle": " Motivational"
}
],
"status": {
"message": "Confirm",
"success": true,
"systemDateTime": "2019-11-01T12:07:05+03:30",
"httpStatusCode": 200
}
}
型号:
struct Result : Decodable {
let Id : Int
let Title : String
let EnTitle : String
}
class ResultInitialiser {
let Id : Int
let Title : String
let EnTitle : String
init(Id:Int, Title:String, EnTitle: String) {
self.Id = Id
self.Title = Title
self.EnTitle = EnTitle
}
}
View Controller:
var genresFetch = [Result]()
var structGenresFetch = [ResultInitialiser]()
let headers : HTTPHeaders = ["Token" : "6f8652e3-d9d9-4b34-9455-0fa32e82ec58"]
AF.request(BASE_URL!, method: .get, headers: headers).response { (response) in
do {
self.genresFetch = [try JSONDecoder().decode(Result.self, from: response.data!)]
for eachProduct in self.genresFetch {
let recived_Data = ResultInitialiser(Id: eachProduct.Id, Title: eachProduct.Title, EnTitle: eachProduct.EnTitle)
self.structGenresFetch.append(recived_Data)
print(eachProduct.Title)
DispatchQueue.main.async {
self.tvMainApi.reloadData()
}
}
}catch {
print(error)
}
}
答案 0 :(得分:0)
“没有与键CodingKeys相关联的值(字符串值:\” Id \“,整数值:无)
json的根仅包含result
键,并且没有ID或您使用Result
结构提交的其他键,因此您需要
self.genresFetch = try JSONDecoder().decode(Root.self, from: response.data!)
print(self.genresFetch.result)
struct Root : Decodable {
let result : [Result]
}
struct Result: Decodable {
let id: Int
let title, enTitle: String
enum CodingKeys: String, CodingKey {
case id = "Id"
case title = "Title"
case enTitle = "EnTitle"
}
}
答案 1 :(得分:0)
JSONDecoder
将尝试从根解码JSON。在根级别,只有两个键,results
和status
。您传递给它的Decodable
类型Result
都没有这些键。
您需要创建另一个结构:
struct Response {
let results: [Result]
}
并解码此结构:
do {
// notice the change to this line
self.genresFetch = try JSONDecoder().decode(Response.self, from: response.data!).results
...
}catch {
print(error)
}
IMO,您不需要称为class
的额外ResultInitialiser
。仅将结构用作模型有什么问题?