ObjectMapper的基本使用
1 引入import ObjectMapper
2 创建基本数据模型
(2.1) 建立数据模型,遵守 Mappable
(2.2 ) 实现Mappable协议的方法。required init?(map: ObjectMapper.Map) {}
func mapping(map: ObjectMapper.Map) {}
3 ObjectMapper接收数据,然后就会自动映射到属性,我们可以点语法直接使用
需要解析的数据
{
"list": [
{
"id": 1000,
"avatar": "4e7f0c83ly8g1ho507078j20ro0rojtq.jpg",
"vip": true,
"name": "娄艺潇",
"date": "2020-01-05 22:51",
"isFollowed": false,
"text": "潮汕菜太好吃了,暴饮暴食后的我为了明天能穿上演出礼服,不得不徒步走回酒店,边走边锻炼,别夸我敬业,毕竟彩排完我还想吃顿宵夜。[允悲]还有啥推荐的美食不?",
"images": [
"4e7f0c83gy1gam2misv31j21hc0u016k.jpg",
"4e7f0c83gy1gam2mjhk8zj21hc0v6wnx.jpg",
"4e7f0c83gy1gam2ml6nucj22tc240kjl.jpg",
"4e7f0c83gy1gam2mn58d3j22tc240qv5.jpg",
"4e7f0c83gy1gam2mp0x4pj22tc240u0x.jpg",
"4e7f0c83gy1gam2mr1b81j22tc2407wi.jpg"
],
"commentCount": 2200,
"likeCount": 11319,
"isLiked": true
}
}
创建数据模型
import Foundation
import ObjectMapper
/// 关注名单
struct FocusList: Mappable {
var list: [UserInfo]?
mutating func mapping(map: ObjectMapper.Map) {
list <- map["list"]
}
init?(map: ObjectMapper.Map) {}
}
/// 用户信息
class UserInfo: Mappable {
var id: Int?
var avatar: String?
var vip: Bool?
var name: String?
var date: Date?
var isFollowed: Bool?
var text: String?
var test: String?
var images: [Any]?
var commentCount: Int?
var likeCount: Int?
var isLiked: Bool?
required init?(map: ObjectMapper.Map) {}
// 如果漏写了map,解析的不到数据,默认为nil
func mapping(map: ObjectMapper.Map) {
id <- map["id"]
avatar <- map["avatar"]
vip <- map["vip"]
name <- map["name"]
isFollowed <- map["isFollowed"]
text <- map["text"]
test <- map["test"]
images <- map["images"]
commentCount <- map["commentCount"]
likeCount <- map["likeCount"]
isLiked <- map["isLiked"]
date <- (map["date"], DateTransform())
}
}
struct UserSubDetail: Mappable {
var desc: String?
var name: String?
var num: Int?
mutating func mapping(map: ObjectMapper.Map) {
desc <- map["desc"]
name <- map["name"]
num <- map["num"]
}
init?(map: ObjectMapper.Map) {}
}
具体使用
在不使用嵌套模型,只利用class UserInfo的情况下解析服务器返回的数据并应用。
func loadNewData() {
let url = GlobalConfig.USERDETAIL_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
guard let res = response.result.value, let weakSelf = self else { return }
let dic = res as? [String: Any]
let arr = dic?["list"] as? [[String: Any]]
guard let arrT = arr else { return }
weakSelf.userItems.removeAll()
weakSelf.userItems = Mapper<UserInfo>().mapArray(JSONArray: arrT)
weakSelf.mTableView.reloadData()
})
}
}
print("----1---->", userInfo.id as Any) // Optional(1000)
print("----2---->", userInfo.avatar as Any) // Optional("4e7f0c83ly8g1ho507078j20ro0rojtq.jpg")
print("----3---->", userInfo.vip as Any) // Optional(true)
print("----4---->", userInfo.name as Any) // Optional("娄艺潇")
print("----5---->", userInfo.date as Any) // Optional(1970-01-01 00:33:40 +0000)
print("----6---->", userInfo.text as Any) // Optional("潮汕菜太好吃了")
print("----7---->", userInfo.images as Any) // Optional([4e7f0c83gy1gam2misv31j21hc0u016k.jpg, 4e7f0c83gy1gam2mjhk8zj21hc0v6wnx.jpg, 4e7f0c83gy1gam2ml6nucj22tc240kjl.jpg, 4e7f0c83gy1gam2mn58d3j22tc240qv5.jpg, 4e7f0c83gy1gam2mp0x4pj22tc240u0x.jpg, 4e7f0c83gy1gam2mr1b81j22tc2407wi.jpg])
使用嵌套模型,利用struct FocusList 和 class UserInfo的情况下解析服务器返回的数据并应用。
func loadNewData() {
let url = GlobalConfig.USERDETAIL_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
guard let res = response.result.value, let weakSelf = self else { return }
let focusList = Mapper<FocusList>().map(JSONObject: res)
guard let userItemsTemp = focusList?.list else { return }
// 逃逸闭包用到self,以及它的属性需要捕获一下.[weak self]表示弱引用,弱引用肯定是可选类型
weakSelf.userItems.removeAll()
weakSelf.userItems = userItemsTemp
weakSelf.mTableView.reloadData()
})
}
}