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,063評論 7 49
  • 轉發自:MFExtension使用 一、MJExtension第三方框架 我們在iOS開發過程中,我們常常需要將字...
    碧玉小瑕閱讀 1,475評論 1 2
  • 簡評:個人認同 Uncle Bob 能損害軟件架構的只能是開發者的說法,但也認為對于絕大多數開發者而言,更多的測試...
    極小光閱讀 411評論 1 1