Json與Object之間互相轉換--ObjectMapper框架

應用場景

在項目開發過程中,很多時候移動終端設備都要與服務器進行數據交互。兩者之間的數據格式通常為 JSON 和 XML。而這些數據通常都跟我們的Model(Java 中常被稱作bean)是一一對應的,在成功接收到從服務器返回過來的數據后,我們可以將 JSON 數據當作一個個的鍵值對然后進行解析,雖然這也算是一種解決方式,但一定程度上加大開發者的工作量。如果不需要全部解析,我一般采用SwiftJSON進行解析,速度比較快。但有時我們希望能將 JSON 數據快速的解析成一個 Object,那么選擇第3方框架ObjectMapper是個不錯的選擇。


ObjectMapper介紹(與android中的Gson框架類似)

ObjectMapper 是一個基于 Swift 語言開發的能夠讓 JSON 與 Object 之間輕易轉換的類庫。通過 ObjectMapper 我們可以將 JSON 數據轉換成 Model 對象或將 Model 對象轉換成 JSON 數據。

官方描述:ObjectMapper is a framework written in Swift that makes it easy for you to convert your model objects (classes and structs) to and from JSON.

ObjectMapper在github上的地址

https://github.com/Hearst-DD/ObjectMapper

ObjectMapper 有如下幾大特點:

  • Mapping JSON to Object(JSON 映射成對象)
  • Mapping Object to JSON(對象轉換成 JSON)
  • Nested Object(支持內嵌對象功能,包括數據和字典)
  • Support Struct(也對結構體做了支持)

官方介紹ObjectMapper可以解析web api中的json數據,也可以與Realm數據庫配合使用

  • ObjectMapper + Alamofire
  • ObjectMapper + Realm

項目中引入ObjectMapper庫

官方提供了多種引用方式,Installation章節介紹的很詳細。
在此我才用Carthage管理方式引用

在Cartfile文件中添加對ObjectMapper的依賴
github "Hearst-DD/ObjectMapper" ~> 2.2

如果你不懂的如何通過Carthage管理依賴,請看我之前寫的 iOS引入第3方庫詳細步驟--Alamofire4.x及SwiftJson

不要忘記在代碼中引入ObjectMapper
import ObjectMapper

在ObjectMapper官網copy User實體類的定義
//==========定義需要Map的實體類,實現Mappable協議中的2個Option方法init、mapping
class User: Mappable {
    var username: String?
    var age: Int?
    var weight: Double!
    var array: [Any]?
    var dictionary: [String : Any] = [:]
    var bestFriend: User?                       // Nested User object
    var friends: [User]?                        // Array of Users
    var birthday: Date?
    
    required init?(map: Map) {
        
    }
    
    // Mappable
    func mapping(map: Map) {
        username    <- map["username"]
        age         <- map["age"]
        weight      <- map["weight"]
        array       <- map["arr"]//這里注意map的是dict,也就是說在json字符串中編寫為dict
        dictionary  <- map["dict"]  //這里注意map的是dict,也就是說在json字符串中編寫為dict
        bestFriend  <- map["best_friend"] ////這里注意map的是best_friend,也就是說在json字符串中編寫為best_friend
        friends     <- map["friends"]
        birthday    <- (map["birthday"], DateTransform())
    }
}


根據這個實體類定義一個String 變量

不得不嘮叨一下,xcode這ide 在string定義方便不夠智能,copy字符到ide中不會為我自動加上\轉意符。
幸運的是我Android Studio 還算熟悉,借助它很把設計好的字符串粘貼到String 變量,它可以幫我們智能的添加轉意符。

    let jsonStr = "{\n" +
        "\"username\": \"牽手生活\",\n" +
        "\"age\": 39,\n" +
        "\"weight\": 62,\n" +
        "\"arr\": [\"Mark\",\"Li\"],\n" +  //注意map的名稱與實體對象不一致
        "\"dict\":{\"like\":\"體育\",\"money\":23},\n" + //注意map的名稱與實體對象不一致
        "\"best_friend\": {\n" +     //注意map的名稱與實體對象不一致
        "\"username\": \"牽手小孩\",\n" +
        "\"age\": 24,\n" +
        "\"weight\": 62,\n" +
        "\"arr\": [\"sqlserver\",\"java\",\"swfit\",\"android\",\"ios\"],\n" +
        "\"birthday\": 20010902\n" +
        "},\n" +
        "\"birthday\": 20010902\n" +
    "}"


在項目中調用
        //json字符串轉model對象
        let user = User(JSONString: jsonStr) //把json字符串轉換為user對象,user對象是嵌套對象

        //Convert a model object to a JSON string:
        let newJSONStr = user?.toJSONString(prettyPrint: true) //把model對象轉換為json字符串
        print(user)  //設置斷點查看轉換后的結果是否正確
        print(newJSONStr)  //打印出來看看

設置斷點用于調試查看結果
json2object.png
斷點處檢查ObjectMapper解析是否正確
debugInfo.png

附JSON格式介紹

JSON 的全稱叫做 JavaScript Object Notation ,翻譯成中文就是 JavaScript 對象表示法,是一種輕量級的數據交互格式

對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。


object.gif

數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。

array.gif

值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。

value.gif

分享是一種美德,牽手是一種生活方式。

最后感謝簡書提供的分享平臺,你覺得有用可以收藏方便以后查閱。

個人分享內容分類

今日頭條號--牽手生活 :android 破解與逆向(暫未接觸ios逆向)

csdn--牽手生活 :android 入門級介紹、部分工具類分享。

簡書--牽手生活 :側重打造-ios樂園

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,259評論 25 708
  • 在實際項目開發過程中,很多時候移動終端設備都要與服務器進行數據交互。兩者之間的數據格式通常為 JSON 和 XML...
    Anenn閱讀 11,440評論 6 22
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 我們今天學習個荷花定律: 一個荷花池,第一天荷花開放的很少,第二天開放的數量是第一天的兩倍,之后的每一天,...
    清雨_滋潤心田閱讀 1,741評論 0 0
  • 2017.5.18 焦慮不堪、恨這世界莫多的套路,為何不能與人為善并互為理解,生活就在腳下,路 為自己所選、奈何路...
    AriesJesse閱讀 158評論 0 0