Ios 从Swift 5中的JSON对象创建对象
需要从JSON对象创建对象 来自API的JSON响应Ios 从Swift 5中的JSON对象创建对象,ios,json,swift,Ios,Json,Swift,需要从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
{
"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上出错
像这样解码
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.从响应创建数据//这是[[String:Any]]的数组
让jsonData=try JSONSerialization.data(使用jsonobject:jsonResponse[“data”]as![[String:Any]]
您只是缺少ObjSportsIcon类的可编码实现
struct ObjSportsList : Codable {
var id:Int
var name:String
var slug:String
var icons:ObjSportsIcon
}
struct ObjSportsIcon : Codable {
var green:String
var grey:String
var white:String
var black:String
}
或者,您可以使用以下代码使其正确:
public struct ObjSportsList : Codable {
var id:Int
var name:String
var slug:String
var icons:ObjSportsIcon
public init(id: Int, name: String, slug: String, icons: ObjSportsIcon) {
self.id = id
self.name = name
self.slug = slug
self.icons = icons
}
public enum CodingKeys: String, CodingKey {
case id
case name
case slug
case icons
}
}
public struct ObjSportsIcon : Codable {
var green:String
var grey:String
var white:String
var black:String
public init(green: String, grey: String, white: String, black: String) {
self.green = green
self.grey = grey
self.white = white
self.black = black
}
public enum CodingKeys: String, CodingKey {
case green
case grey
case white
case black
}
}
更改以下代码行以解决第二个错误:
self.arrSports = try decoderdec.decode(Array<ObjSportsList>.self, from: jsonData)
您只是缺少ObjSportsIcon类的可编码实现
struct ObjSportsList : Codable {
var id:Int
var name:String
var slug:String
var icons:ObjSportsIcon
}
struct ObjSportsIcon : Codable {
var green:String
var grey:String
var white:String
var black:String
}
或者,您可以使用以下代码使其正确:
public struct ObjSportsList : Codable {
var id:Int
var name:String
var slug:String
var icons:ObjSportsIcon
public init(id: Int, name: String, slug: String, icons: ObjSportsIcon) {
self.id = id
self.name = name
self.slug = slug
self.icons = icons
}
public enum CodingKeys: String, CodingKey {
case id
case name
case slug
case icons
}
}
public struct ObjSportsIcon : Codable {
var green:String
var grey:String
var white:String
var black:String
public init(green: String, grey: String, white: String, black: String) {
self.green = green
self.grey = grey
self.white = white
self.black = black
}
public enum CodingKeys: String, CodingKey {
case green
case grey
case white
case black
}
}
更改以下代码行以解决第二个错误:
self.arrSports = try decoderdec.decode(Array<ObjSportsList>.self, from: jsonData)
我不知道你为什么要面对这个问题,因为我已经尝试过复制粘贴你的代码。一切都很好。请参考下面的代码
模型类:
解析代码:
我不知道你为什么要面对这个问题,因为我已经尝试过复制粘贴你的代码。一切都很好。请参考下面的代码
模型类:
解析代码:
有两种选择:
旧方法-从JSON创建init
将JSON转换为数据。在我的情况下,这个选项很有帮助
有两种选择:
旧方法-从JSON创建init
将JSON转换为数据。在我的情况下,这个选项很有帮助
您应该将“ObjSportsIcon”结构与可编码协议相一致,ObjSportsIcon
应该确认为Codable
。您可以提供示例吗?您的错误解释了一切,当您使用数组时,您的json响应是字典。将响应更改为从arrayyou应该将“ObjSportsIcon”结构与可编码协议一致ObjSportsIcon
应该确认为Codable
。您可以提供示例吗?您的错误解释了一切,当您使用数组时,您的json响应是字典。将您的响应更改为从arrayThank you for answer,第一个错误已解决,如declare struct,但在self.arrports=try decoderDecode.decode([ObjSportsList].self,from:jsonData)上仍然存在错误。
error:无法将类型“[ObjSportsList]”的值分配给类型“[[String:Any]]”@Vivek Check更新的答案,您只需更改一行代码。@Vivek您以前没有提到arrSport的声明:),无论如何,它解决了这一问题。有没有办法在图标:ObjSportsIcon
中使用像“pink”这样的可选键?有没有办法在图标:ObjSportsIcon
中使用像“pink”这样的可选键?,我想添加我自己的键,如未从API收到的selected:Bool
,我将通过选择tableview更改selected
键,并在tableview单元格上显示selected
键。感谢您的回答,第一个错误已解决,如declare struct,但self.arrports=try decoderdec.decode上仍然存在错误([ObjSportsList].self,from:jsonData)
错误:无法将类型“[ObjSportsList]”的值分配给类型“[[String:Any]]“@Vivek Check更新了答案,您只需更改一行代码即可。@Vivek您以前没有提到arrSport的声明:),无论如何,它解决了这一问题。有没有办法在图标:ObjSportsIcon
中输入像“pink”这样的可选键?有没有办法在图标:ObjSportsIcon
中输入像“pink”这样的可选键,我想添加我自己的键像不是从API收到的selected:Bool
,我将通过选择tableview来更改selected
键,并在tableview单元格上显示selected
键。OP提供的json和您在代码中提到的json之间有很多不同。那么,您怎么能说您只是复制粘贴了他的代码和所有内容呢g在工作fine@Vikky我刚刚将JSON数组转换为Swift数组语法,没有其他内容。但是OP的JSON响应不是一个数组。看看他有什么错误mentioned@Vikky再次阅读问题。另外,如果您对代码给予了充分的关注,那么您已经注意到,OP被问及数组。是的,他在更新中提到了这一点,但他发布的json是无效的但是如果我们假设它的数组一切正常OP提供的json和你在代码中提到的json有很大的不同,那么你怎么能说你只是复制粘贴了他的代码,一切正常呢fine@Vikky我刚刚将JSON数组转换为Swift数组语法,但OP的JSON响应不是数组。看看他犯了什么错误mentioned@Vikky再次阅读问题。另外,如果您对代码给予了充分的关注,那么您已经注意到,OP被问及数组。是的,他在更新中提到了这一点,但他发布的json是无效的json。但如果我们假设它的数组,那么一切正常
let decoderdec = JSONDecoder()
decoderdec.keyDecodingStrategy = .convertFromSnakeCase
let aryTemp = [[
"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"
]
]]
do {
let jsonData = try JSONSerialization.data(withJSONObject: aryTemp)
let arrSports = try decoderdec.decode([ObjSportsList].self, from: jsonData)
print(arrSports)
} catch let error {
print(error)
}
let data = try JSONSerialization.data(withJSONObject: dictionary, options: [.fragmentsAllowed])