應用場景
在項目開發過程中,很多時候移動終端設備都要與服務器進行數據交互。兩者之間的數據格式通常為 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) //打印出來看看
設置斷點用于調試查看結果
斷點處檢查ObjectMapper解析是否正確
附JSON格式介紹
JSON 的全稱叫做 JavaScript Object Notation ,翻譯成中文就是 JavaScript 對象表示法,是一種輕量級的數據交互格式
對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
分享是一種美德,牽手是一種生活方式。
最后感謝簡書提供的分享平臺,你覺得有用可以收藏方便以后查閱。
個人分享內容分類
今日頭條號--牽手生活 :android 破解與逆向(暫未接觸ios逆向)
csdn--牽手生活 :android 入門級介紹、部分工具類分享。
簡書--牽手生活 :側重打造-ios樂園