Swift--字典轉(zhuǎn)模型

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方法膏孟,結(jié)構(gòu)體則省略
        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 = ""
    }

解析數(shù)據(jù):

        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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丢氢,一起剝皮案震驚了整個濱河市先改,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仇奶,老刑警劉巖貌嫡,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異该溯,居然都是意外死亡岛抄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門狈茉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夫椭,“玉大人,你說我怎么就攤上這事氯庆〔淝铮” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵堤撵,是天一觀的道長仁讨。 經(jīng)常有香客問我,道長实昨,這世上最難降的妖魔是什么洞豁? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上丈挟,老公的妹妹穿的比我還像新娘闰挡。我一直安慰自己,他們只是感情好礁哄,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溪北,像睡著了一般桐绒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上之拨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天茉继,我揣著相機(jī)與錄音蚀乔,去河邊找鬼派撕。 笑死,一個胖子當(dāng)著我的面吹牛终吼,可吹牛的內(nèi)容都是我干的际跪。 我是一名探鬼主播喉钢,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼幔戏,長吁一口氣:“原來是場噩夢啊……” “哼评抚!你這毒婦竟也來了伯复?” 一聲冷哼從身側(cè)響起啸如,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤想暗,失蹤者是張志新(化名)和其女友劉穎说莫,沒想到半個月后储狭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辽狈,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡驮配,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年壮锻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片途事。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖减俏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奏夫,我是刑警寧澤酗昼,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站呛哟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扫责。R本人自食惡果不足惜鳖孤,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腿准。 院中可真熱鬧吐葱,春花似錦弟跑、人聲如沸孟辑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尽狠。三九已至叶圃,卻和暖如春哩陕,著一層夾襖步出監(jiān)牢的瞬間悍及,已是汗流浹背心赶。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工椭符, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留销钝,地道東北人蒸健。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像盯捌,于是被迫代替她去往敵國和親饺著。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350