庫是為了把一些繁瑣的操作變的更簡單,說白了就是封裝邑蒋。
Json轉Model 也有一些庫了,我寫這個簡單的庫就練練手按厘,其他庫我也沒用過医吊,(項目中還是半自動,手寫轉的)逮京。
簡單介紹下ZZJModel卿堂,就是將Json類型的數據一行代碼轉成對象。對json不了解的 自行google懒棉。
這里有一組json
{
"code": 0,
"msg": "",
"result": {
"room": {
"id": "5",
"uid": "78",
"house": 0,
"start_time": "2015-11-28",
"city": "上海",
"region": "長寧",
"address": "仁達商務樓",
"summary": "祖安求輔助",
"pricemin": 3000,
"moneymin": 2000,
"longitude": "121.43660700",
"latitude": "31.21492900",
"comment_count": 19,
"photo_count": 7,
"subway_station": "交通大學",
"subway_line": "11號線",
"status": 0,
"format_time": "11-27",
"create_time": "04-13",
"last_modify_time": "2015-11-27 18:33:51",
"dateDetail": "11月28日入住",
"pricesection": "預算 2000",
"cost1": 2000,
"cost2": null,
"localization": "長寧 11號線 交通大學",
"content": "祖安求輔助"
},
"content": {
"id": "5",
"content": "祖安求輔助",
"show_content": true
},
"show_content": 1233
}
,
"station": [
"富錦路",
"友誼西路",
"寶安公路",
"共富新村",
"呼蘭路",
"通河新村",
"共康路",
"彭浦新村",
"汶水路",
"上海馬戲城",
"延長路",
"中山北路",
"上翰菝瑁火車站",
"漢中路",
"新閘路",
"人民廣場",
"黃陂南路",
"陜西南路",
"常熟路",
"上海圖書館",
"衡山路",
"徐家匯",
"上海體育館",
"漕寶路",
"上海南站",
"錦江樂園",
"蓮花路",
"外環(huán)路",
"莘莊"
]
,"items":[
{
"id": "5",
"content": "測試1",
"show_content": true
},
{
"id": "6",
"content": "測試2",
"show_content": true
},
{
"id": "7",
"content": "測試3",
"show_content": false
}
]
}
這是一段比較復雜的json,這組json看來 整體是一個對象 中間還有一個room對象和content對象。 還有一個數組 一個對象數組 , 手動轉肯定要寫很多for循環(huán)策严。那么 我這個庫呢穗慕?
首先 讀取JSON,我這些字串放在.json文件中妻导,用SwiftyJSON讀取逛绵, 后面我有可能會直接考慮加上data轉model 現(xiàn)在不會加
if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json"){
let data:NSData?
do {
data = try NSData(contentsOfFile: path, options: NSDataReadingOptions())
let json = JSON(data:data!)
//任意對象的模型轉json 必須是dic
let all = ZZAll.zz_objToModel(json.object) as ZZAll //這里需要轉一下
print(all.result?.room?.address)
if let dic = json.dictionaryObject{
let all1 = ZZAll.zz_dicToModel(dic) as ZZAll //這里需要轉一下
print(all1.result?.content?.id)
}
}catch let err {
debugPrint(err)
}
}
除了獲取json數據的方法 字典轉模型 就一句話
let all = ZZAll.zz_objToModel(json.object) as? ZZAll
或者
let all1 = ZZAll.zz_dicToModel(dic) as? ZZAll
這樣就可以打印對象中的信息 包括對象中的對象的屬性
print(all?.result?.room?.address)
有兩種調用方式 一種是傳入AnyObject 一種是傳入[String:AnyObject]
git上大多數庫的model都是要繼承第三方JSON轉Model的庫的 怀各,我們這里 不用
model
/// 所有信息
class ZZAll: NSObject{
//MARK: - 屬性定義
var code:NSNumber?
var msg:String?
var result:ZZResult?
var station:[String]?
var items:[ZZContent]?
/**
根據Key獲取實體相關信息
- returns: 字典
*/
override func zz_modelPropertyClass()->[String:AnyClass]?{
return ["result":ZZResult.self,"items":ZZContent.self] //傳入對應類型
}
}
如果有對象屬性 需要重寫zz_modelPropertyClass方法 返回key,value
就這樣把所有model 寫出來就行了。
/// 結果信息
class ZZResult: NSObject{
//MARK: - 屬性定義
var show_content:NSNumber?
var content:ZZContent?
var room:ZZRoom?
override func zz_modelPropertyClass()->[String:NSObject]?{
return ["room":ZZRoom.self,
"content":ZZContent.self]
}
}
/// 內容信息
class ZZContent: NSObject{
//MARK: - 屬性定義
var id:NSNumber?
var content:String?
var show_content:Bool?
}
Room 比較雷同 屬性較多久不貼了
目前庫還有點問題 术浪,沒辦法處理Bool類型瓢对,setValue不能給他賦值,objc_setAssociatedObject也沒用 添吗。Bool對應的對象類型是NSNumber 這塊還在考慮怎么處理 沥曹。如果誰有好的idea,點一下 碟联,不勝感激妓美!
那么怎么實現(xiàn)的呢,也很簡單就一個文件
總共就200多行代碼 鲤孵,感興趣的同學可以看看壶栋。