【发布时间】:2019-10-28 16:41:14
【问题描述】:
需要从 JSON 对象创建对象
来自 API 的 JSON 响应
{
"id": 1,
"name": "Cricket",
"slug": "cricket",
"banner_image": "https://cricket.jpg",
"icons": {
"green": "http://localhost:8000/sport_icon_cricket_green.png",
"grey": "http://localhost:8000/sport_icon_cricket_gray.png",
"white": "http://localhost:8000/sport_icon_cricket_white.png",
"black": "http://localhost:8000/sport_icon_cricket_black.png"
}
},
{
"id": 2,
"name": "Baseball",
"slug": "baseball",
"banner_image": "https://baseball.jpg",
"icons": {
"green": "http://localhost:8000/sport_icon_baseball_green.png",
"grey": "http://localhost:8000/sport_icon_baseball_gray.png",
"white": "http://localhost:8000/sport_icon_baseball_white.png",
"black": "http://localhost:8000/sport_icon_baseball_black.png"
}
},
我创建了struct,如下所示
以下链接错误
struct ObjSportsList:Codable
struct ObjSportsList:Codable { // Error on this line -> Error : Type 'ObjSportsList' does not conform to protocol 'Decodable'
var id:Int
var name:String
var slug:String
var icons:ObjSportsIcon
}
struct ObjSportsIcon {
var green:String
var grey:String
var white:String
var black:String
}
像这样解码
let decoderdec = JSONDecoder()
decoderdec.keyDecodingStrategy = .convertFromSnakeCase
// 2. Create Data from Response
let jsonData = try JSONSerialization.data(withJSONObject: jsonResponse["data"] as! [[String:Any]])
// 3 Convert Data to Object (Array) if don't user array then only pass ObjCountry.self
self.arrSports.removeAll()
self.arrSports = try decoderdec.decode([ObjSportsList].self, from: jsonData)
解码行出错:无法分配“[ObjSportsList]”类型的值 输入 '[[String : Any]]'
更新
// 错误 2.Create Data from Response // 这是 [[String:Any]] 的数组 let jsonData = try JSONSerialization.data(withJSONObject: jsonResponse["data"] as! [[String:Any]])
【问题讨论】:
-
你也应该让“ObjSportsIcon”结构符合 Codable 协议
-
ObjSportsIcon应确认为Codable。 -
你能举个例子吗?
-
您的错误说明了一切,您的 json 响应是字典,而您正在查看数组。将您的响应更改为从数组开始