HandyJSON的基本使用
1 引入import HandyJSON
2 创建基本数据模型
(2.1) 遵守 HandyJSON
(2.2 ) 实现HandyJSON协议的init方法
(2.3) mapping 方法用来映射。把解析到的json数据,赋值给其他的变量。有2个好处:可以用去区分服务端字段和我们自定义的属性字段,同时也会解包。
3 HandyJSON接收数据,然后就会自动映射到属性,我们可以点语法直接使用
协议中定义初始化器init,非final类实现时必须加上required
模型和嵌套模型都可以继承NSObject,要注意override重写方法
HandyJSON 中通过运算符重载mapping实现多种模型转换方法
需要解析的数据
{
"list": [
{
"desc": "资布给回管并转例快真应社斗。",
"name": "蔡平",
"num": 25
}
}
模型实列
import HandyJSON
import UIKit
class BookHandyJsonModel: HandyJSON {
var list = [BookModel()] // 嵌套模型
required init() {}
}
class BookModel: HandyJSON {
var desc: String?
var name: String?
var num: String?
var my_desc: String = ""
var my_name: String = ""
// @objc var info = Info()//嵌套模型
required init() {}
var cellHeight: CGFloat {
var height = 0.0
let labelWidrh = kScreenWidth - 130
let font = 17.0
guard let contentHeight = desc?.RD_getStringHeight(labelWidrh, font) else { return 0 }
height += contentHeight
height += 10 + 10
return height > 60 ? height : 60.0
}
func mapping(mapper: HelpingMapper) {
mapper <<< self.my_desc <-- "desc" // 把desc 转换为模型中的 my_desc
mapper <<< self.my_name <-- "name" // 把name 转换为模型中的 my_name
}
}
// 子模型
class BookInfo: NSObject, HandyJSON {
@objc var img: String = ""
@objc var name: String = ""
override required init() {}
override var description: String {
return self.dictionaryWithValues(forKeys: ["img",
"name"]).description
}
}
具体使用
网络获取数据并解析
直接使用.语法就可以映射对应的模型字段
func getNetModel() {
let url = GlobalConfig.BOOKLIST_URL
let parameters = ["key": "value"]
DispatchQueue.global().async {
Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON(completionHandler: { [weak self] response in
if let res = response.result.value {
let dic = res as? [String: Any]
/// HandyJSON接受字典
guard let resObj = BookHandyJsonModel.deserialize(from: dic), let self = self else { return }
bookArray.removeAll()
bookArray = resObj.list
mTableView.reloadData()
}
})
}
}
let bookModel = bookArray[0]
print("desc:", bookModel.desc as Any) // desc: Optional("放片干关支清军至战广青期名别过。
print("name:", bookModel.name as Any) // name: Optional("金超")
print("num:", bookModel.num as Any) // num: Optional("23")
print("cellHeight:", bookModel.cellHeight) // cellHeight: 101.1484375
print("my_desc:", bookModel.my_desc) // my_desc: 放片干关支清军至战广青期名别过
print("my_name:", bookModel.my_name) // my_name: 金超