美文网首页swiftios实用技术iOS 开发
Swift-结合SwiftyJSON、MJExtension解析

Swift-结合SwiftyJSON、MJExtension解析

作者: wg刚 | 来源:发表于2019-06-20 14:41 被阅读0次
在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{}

结果如下图

相关文章

网友评论

    本文标题:Swift-结合SwiftyJSON、MJExtension解析

    本文链接:https://www.haomeiwen.com/subject/lebdqctx.html