[Swift學習筆記] ObjectMapper 框架

Hearst-DD/ObjectMapper

ObjectMapper是用Swift語言實現(xiàn)對象和JSON相互轉換的框架

ObjectMapper框架支持的數據結構類型:

  • Int
  • Bool
  • Double
  • Float
  • String
  • RawRepresentable(Enums)
  • Array<AnyObject>
  • Dictionary<String, AnyObject>
  • Object<T: Mappable>
  • Array<T: Mappable>
  • Array<Array<T: Mappable>>
  • Set<T: Mappable>
  • Dictionary<String, T: Mappable>
  • Dictionary<String, Array<T: Mappable>>
  • Optionals of all the above //上述的可選類型
  • Implicitly Unwrapped Optionals of the above //上述的隱式解析可選類型

其中Mappable是ObjectMapper框架中定義的一個接口

public protocol Mappable {
 /// This function can be used to validate JSON prior to mapping.
 /// Return nil to cancel mapping at this point
 init?(_ map: Map)
 /// This function is where all variable mappings should occur. 
 ///It is executed by Mapper during the mapping (serialization and deserialization) process.
 mutating func mapping(map: Map)
}

配置

  • 在項目的podfile中添加:
pod 'ObjectMapper', '~> 1.3'
  • 運行 pod install

案例

class User: Mappable {
    var username: String?
    var age: Int?
    var weight: Double!
    var array: [AnyObject]?
    var dictionary: [String : AnyObject] = [:]
    var bestFriend: User?                       // Nested User object
    var friends: [User]?                        // Array of Users
    var birthday: NSDate?
    var imageURLs: Array<NSURL>?

    required init?(_ map: Map) {

    }

    // Mappable
    func mapping(map: Map) {
        username    <- map["username"]
        age         <- map["age"]
        weight      <- map["weight"]
        array       <- map["arr"]
        dictionary  <- map["dict"]
        bestFriend  <- map["best_friend"]
        friends     <- map["friends"]
        birthday    <- (map["birthday"], DateTransform())
        posterURL   <- (map["image"], URLTransform())
    }
}

自定義的Model需要實現(xiàn)Mappable接口,并在mapping(map: Map)方法中將Model的屬性與JSON結構的Key相映射, 如果ObjectMapper支持該屬性的類型的轉換, 只需要寫

username <- map["username"]

如果ObjectMapper不支持轉換就需要調用Mappable額外提供的類, NSDate類型可以用DateTransform()類轉換:

birthday <- (map["birthday"], DateTransform())

如果ObjectMapper也沒有提供類型轉化方法就需要自定義了轉換類了, 這里就自定義了一個URLArrayTransform類:

import Foundation
import ObjectMapper

class URLArrayTransform: TransformType {
    typealias Object = Array<NSURL>
    typealias JSON = Array<AnyObject>
    
    init() {}
    
    func transformFromJSON(value: AnyObject?) -> Array<NSURL>? {
        if let URLStrings = value as? [String] {
            var listOfUrls = [NSURL]()
            for item in URLStrings {
                if let url = NSURL(string: item) {
                    listOfUrls.append(url)
                }
            }
            return listOfUrls
        }
        return nil
    }
    
    func transformToJSON(value: [NSURL]?) -> JSON? {
        if let urls = value {
            var urlStrings = [String]()
            for url in urls {
                urlStrings.append(url.absoluteString)
            }
            return urlStrings
        }
        
        return nil
    }
}

自定義的轉換類需要實現(xiàn) ObjectMapper 的 TransformType 接口, 從 URLArrayTransform 的實現(xiàn)中可以看出自定義轉換類還是比較簡單的, 主要就是重寫 transformFromJSON 和 transformToJSON 方法.

完整實現(xiàn)了 User 類后, 就可以是 User 和 JSON 字符串相互轉換了

let user = User(JSONString: JSONString)

let JSONString = user.toJSONString(prettyPrint: true)  //prettyPrint參數用于生成JSON字符串是否格式化, 以便于打印

使用Mapper類轉換
let user = Mapper<User>().map(JSONString: JSONString)

let JSONString = Mapper().toJSONString(user, prettyPrint: true)

補充: AlamofireObjectMapper

tristanhimmelman/AlamofireObjectMapper

該框架可以結合 Alamofire 和 ObjectMapper 使用, 為Alamofire的Request類擴展出了responseObject 和 responseArray 方法, 更方便的將網絡通信返回的JSON數據轉換成對象

配置

  • 在項目的podfile中添加:
pod 'AlamofireObjectMapper', '~> 3.0'
  • 運行 pod install

案例

let URL = "..."
Alamofire.request(.GET, URL).responseObject { (response: DataResponse<WeatherResponse>) in

    let weatherResponse = response.result.value

    if let threeDayForecast = weatherResponse?.threeDayForecast {
        for forecast in threeDayForecast {
            print(forecast.day)
            print(forecast.temperature)           
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末胆屿,一起剝皮案震驚了整個濱河市漂彤,隨后出現(xiàn)的幾起案子聊倔,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡堆生,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門雷酪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淑仆,“玉大人,你說我怎么就攤上這事太闺∨淳埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵省骂,是天一觀的道長蟀淮。 經常有香客問我,道長钞澳,這世上最難降的妖魔是什么怠惶? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮轧粟,結果婚禮上策治,老公的妹妹穿的比我還像新娘。我一直安慰自己兰吟,他們只是感情好通惫,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著混蔼,像睡著了一般履腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭嚣,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天遵湖,我揣著相機與錄音,去河邊找鬼晚吞。 笑死延旧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的槽地。 我是一名探鬼主播迁沫,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捌蚊!你這毒婦竟也來了弯洗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逢勾,失蹤者是張志新(化名)和其女友劉穎牡整,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體溺拱,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡逃贝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫摔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沐扳。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖句占,靈堂內的尸體忽然破棺而出沪摄,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布杨拐,位于F島的核電站祈餐,受9級特大地震影響,放射性物質發(fā)生泄漏哄陶。R本人自食惡果不足惜帆阳,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋吨。 院中可真熱鬧蜒谤,春花似錦、人聲如沸至扰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敢课。三九已至阶祭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翎猛,已是汗流浹背胖翰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留切厘,地道東北人萨咳。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像疫稿,于是被迫代替她去往敵國和親培他。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫遗座、插件舀凛、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 今天在微博上看到了這句挺逗逼的句子号坡,于是腦海浮現(xiàn)了這副畫面懊烤,一位提刀的俠客騎著馬路過一棵松樹下,問了一位正在松樹下...
    榮大叔閱讀 933評論 0 1
  • 方法來源 本文所介紹的學習方法主要的觀點來自《如何閱讀一本書》宽堆、《軟技能:代碼之外的生存指南》和《把時間當做朋友》...
    EA88閱讀 765評論 0 2