Swift--字典转模型

1、 initWithDict

这种方式最原始

模型:

          class squareModel : NSObject {
          var ID : String?
          var name : String?
         var icon : String?

          init(dict: [String : Any]) {
            super.init()
              ID = dict["id"] as? String
            name = dict["name"] as? String
            icon = dict["icon"] as? String
          }
    }

解析:

      func loadData(completion: @escaping (_ dictM : DictModel) ->() )  {
            let url  = URL(string: "http://api.budejie.com/api/api_open.php")
            let params = ["a":"square", "c":"topic"]
    
            Alamofire.request(url!, method: HTTPMethod.get, parameters: params, encoding: URLEncoding.default , headers: nil).responseJSON { (response) in
                switch response.result{
                case .success(_):
                    guard let result = response.result.value else {
                        return
                    }
                    guard let dict = result as? [String : Any] else{
                       return
                    }
                    let dictModel = DictModel(dict: dict)
                    completion(dictModel)
                case let .failure(error):
                    print(error)
                    break
                }
            }
        }

2、SwiftyJSON

模型:

    class SwiftyModel: NSObject {
        var count : Int?
        var next_page : Int?
        var total : Int?
        var total_page : Int?
        var list : Array<listM>?
    }
    class listM: NSObject  {
        var fans_count: Int?
        var header: String?
        var uid: Int?
        var is_vip: Bool?
        var is_follow: Int?
        var introduction: String?
        var gender: Int?
        var tiezi_count : Int?
        var screen_name: String?
    }

解析:

     func loadData(completion: @escaping (() -> ())){
            let url  = URL(string: "http://api.budejie.com/api/api_open.php")
            let params = ["a":"list", "c":"subscribe", "category_id":"35", "page":"1"]
            Alamofire.request(url!, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                let json = JSON(response.result.value!)
                self.swiftyModel.count = json["count"].int
                self.swiftyModel.total = json["total"].int
                self.swiftyModel.next_page = json["next_page"].int
                self.swiftyModel.total_page = json["total_page"].int
                guard let array = json["list"].array else{
                    return
                }
                var listArray :[listM] = [listM]()
                for dic in array {
                    let list : listM  = listM()
                    list.header = dic["header"].string
                    list.introduction = dic["introduction"].string
                    list.fans_count = dic["fans_count"].int
                    listArray.append(list)
                }
                self.swiftyModel.list = listArray
                completion()
            }
        }    

3、HandyJSON

模型:

    import HandyJSON

    class HandyModel : HandyJSON  {
        var info: infoModel_Handy = infoModel_Handy()
        var list: [list_Handy]? = [list_Handy]()
        //HandyJSON :模型为类必须添加 init方法,结构体则省略
        required init() { }
    }
    struct infoModel_Handy : HandyJSON{
        var vendor: String = ""
        var count  : Int = 0
        var page : Int = 0
        var maxid: String = ""
        var maxtime: String = ""
    }
    struct list_Handy : HandyJSON{
        var id : String = ""
        var type : String = ""
        var text: String = ""
        var name: String = ""
        var profile_image: String = ""
    }

解析数据:

        func loadData(completion: @escaping (() -> ()))  {     
            let url  = URL(string: "http://api.budejie.com/api/api_open.php")
            let params = ["a":"newlist", "c":"data", "type":"all", "page":"1"]
            Alamofire.request(url!, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                guard let dict : [String : Any] = response.result.value as? [String: Any] else {
                    return
                }
                if let handyM = HandyModel.deserialize(from: dict) {
                    self.handyModel = handyM
                }
                completion()
              }
        }

4、ObjectMapper

模型:

    import ObjectMapper

    class ObjectMapperModel: Mappable {
        var count : Int?
        var next_page : Int?
        var  total : Int?
        var list : [listModel_Map]?
        required init?(map: Map) { }
        // Mappable
        func mapping(map: Map) {
            count       <- map["count"]
            next_page   <- map["next_page"]
            total       <- map["total"]
            list         <- map["list"]
        }
    }
    class listModel_Map : Mappable {
         var fans_count: Int?
        var header: String?
        var uid: Int?
        var is_vip: Bool?
        var is_follow: Int?
        var introduction: String?
        var gender: Int?
        var tiezi_count : Int?
        var screen_name: String?
        required init?(map: Map) { }
        // Mappable
        func mapping(map: Map) {
            fans_count           <- map["fans_count"]
            header               <- map["header"]
            uid                  <- map["uid"]
            is_vip               <- map["is_vip"]
            is_follow            <- map["is_follow"]
            introduction         <- map["introduction"]
            gender              <- map["gender"]
            tiezi_count         <- map["tiezi_count"]
            screen_name         <- map["screen_name"]
        }
    }

解析:

        func loadData(completion: @escaping (() -> ())){
            let url  = URL(string: "http://api.budejie.com/api/api_open.php")
            let params = ["a":"list", "c":"subscribe", "category_id":"35", "page":"1"]
            Alamofire.request(url!, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                guard let dict : [String : Any] = response.result.value as? [String: Any] else {
                    return
                }  
                let objectM = Mapper<ObjectMapperModel>().map(JSON: dict)
                self.objectModel = objectM
                completion()
            }
        }

5、Codable

这是Swift4新推出的

模型

    struct CodableModel: Codable {
        var info : infoModel
        var list : [listModel]
        var total : Int
    }
    struct infoModel: Codable {
        var count : Int
        var np : Int
    }
    struct listModel : Codable {
        var count : Int
        var id : Int
        var name : String
    }

解析:

    func loadData ( completion: @escaping (() -> ()))  {
            let url  = URL(string: "http://api.budejie.com/api/api_open.php")
            let params = ["a" : "category", "c" : "subscribe"]
            Alamofire.request(url!, method: .get, parameters: params , encoding: URLEncoding.default, headers: nil).responseData { (data) in
    //            do{
                    self.codableModel = try! JSONDecoder().decode(CodableModel.self, from: data.result.value!)
    //            }catch {
    //                //异常处理
    //            }
                completion()
            }
        }

附带Demo:
https://gitee.com/iMaBiao/JSONDemo.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349