在Swift或者混编项目中,如何通过MJExtension解析成对应的Model呢(包含嵌套情况)?
看到这篇文章的各位大牛就不需要我解释这两个第三方的作用了,我直接给出可行方案。
1、MJExtension是OC写的,所以在项目中需要新建桥接文件
-
新建一个.h头文件
例如我新建的桥接文件
-
配置桥接文件路径
这个路径可在下图中看到
粘贴你项目中对应的路径即可
-
User Header Search Paths 否则在需要用三方库的地方是调不出来的。
双击User Header Search Paths后面的空白处,设置目录路径为${SRCROOT} 后边选择recursive。
如下图
-
在桥接文件中引入需要引用的OC头文件
2、到此项目配置已经完成,下面举例实现过程
需要解析的数据如下,包含了嵌套,数组,字典
{
"name" : "王喻",
"userTypeId" : 2,
"attributesMap" : {
"yunXinInfor" : "{\"accountId\":\"1_11359_60765c921e8c49a292c7fafb\",\"token\":\"62d115087b4de6c2d390c7026716642b\"}",
"userGudiceTag" : "0"
},
"hospitalsList" : [
{
"bedNum" : 0,
"openFlag" : 0,
"sortOrder" : 0,
"satisfaction" : 0,
"name" : "(客服部)专用医院2018",
"nurseAssessFlag" : 0,
"followUp" : 0,
"nurseTrain" : 0,
"inner" : 0,
"id" : 317
},
{
"bedNum" : 0,
"openFlag" : 0,
"sortOrder" : 0,
"satisfaction" : 0,
"name" : "天津市肿瘤医院",
"nurseAssessFlag" : 0,
"followUp" : 0,
"nurseTrain" : 0,
"inner" : 0,
"id" : 875
}
]
}
-
新建Swift语言的Model
这里有几个注意的地方
1、每一个属性前面需要添加 @objc
2、如果存在属性名字和后台数据名字不一致,则需要重写mj_replacedKeyFromPropertyName方法
3、对于属性数组嵌套model,则需要重写mj_keyValuesDidFinishConvertingToObject,不是OC中的mj_objectClassInArray,切记切记
对应以上三点,我来根据上面数据创建model
第一个model:
class WGLoginAttributesMapModel: NSObject {
@objc var userDeptIds:String?
@objc var userGudiceTag:Int = 0
@objc var yunXinInfor:String?
}
第二个model:后台返回字段id,我对应的属性名字为ID,则
class WGHospitalModel: NSObject {
@objc var bedNum = 0
@objc var openFlag = false
@objc var sortOrder:String?
@objc var satisfaction:String?
@objc var name:String?
@objc var nurseAssessFlag:String?
@objc var followUp:String?
@objc var nurseTrain:String?
@objc var inner:String?
@objc var ID:String?
//后台返回字段id,我对应的属性名字为ID,因此重写如下方法
override static func mj_replacedKeyFromPropertyName() -> [AnyHashable : Any]! {
return ["ID":"id"]
}
}
第三个model:存在子model嵌套,子model数组
class WGLoginModel: NSObject {
@objc var name: String?
@objc var userTypeId: String?
//子model嵌套
@objc var attributesMap: WGLoginAttributesMapModel?
//子model数组
@objc var hospitalsList:Array<WGHospitalModel>?
//因为有子model数据,需要重写如下方法
override func mj_keyValuesDidFinishConvertingToObject() {
if self.hospitalsList != nil {
let list = WGHospitalModel.mj_objectArray(withKeyValuesArray: self.hospitalsList)
if list != nil {
self.hospitalsList = list! as NSArray as? [WGHospitalModel]
}
}
}
}
这里我给出一个完整的model文件,方便对比
import UIKit
class WGLoginModel: NSObject {
@objc var name: String?
@objc var userTypeId: String?
//子model嵌套
@objc var attributesMap: WGLoginAttributesMapModel?
//子model数组
@objc var hospitalsList:Array<WGHospitalModel>?
//因为有子model数据,需要重写如下方法
override func mj_keyValuesDidFinishConvertingToObject() {
if self.hospitalsList != nil {
let list = WGHospitalModel.mj_objectArray(withKeyValuesArray: self.hospitalsList)
if list != nil {
self.hospitalsList = list! as NSArray as? [WGHospitalModel]
}
}
}
}
class WGLoginAttributesMapModel: NSObject {
@objc var userDeptIds:String?
@objc var userGudiceTag:Int = 0
@objc var yunXinInfor:String?
}
class WGHospitalModel: NSObject {
@objc var bedNum = 0
@objc var openFlag = false
@objc var sortOrder:String?
@objc var satisfaction:String?
@objc var name:String?
@objc var nurseAssessFlag:String?
@objc var followUp:String?
@objc var nurseTrain:String?
@objc var inner:String?
@objc var ID:String?
override static func mj_replacedKeyFromPropertyName() -> [AnyHashable : Any]! {
return ["ID":"id"]
}
}
4、使用: json["data"]就是我根据后台拿到的,上面列出来的数据
do{
let json = try JSON(data: response.data!)
let dic = json["data"].rawValue
let model = WGLoginModel.mj_object(withKeyValues: dic)
}catch{}
结果如下图
网友评论