在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{}
結果如下圖