Swift-结合SwiftyJSON、MJExtension解析数据

在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{}

结果如下图

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 下面是我最近两年学习OC中的一些基础知识,对于学习OC基础知识的人可能有些帮助,拿出来分享一下,还是那句话不喜勿喷...
    小小赵纸农阅读 2,631评论 1 7
  • 在日常的iOS开发中,总会进行数据的转换,比如请求服务端获取数据,解析数据,转换成对应的model,这个转换过...
    繁星mind阅读 14,055评论 7 49
  • 转发自:MFExtension使用 一、MJExtension第三方框架 我们在iOS开发过程中,我们常常需要将字...
    碧玉小瑕阅读 1,475评论 1 2
  • 简评:个人认同 Uncle Bob 能损害软件架构的只能是开发者的说法,但也认为对于绝大多数开发者而言,更多的测试...
    极小光阅读 411评论 1 1