美文网首页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