Ios 从Swift 5中的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

需要从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上出错

像这样解码

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])