Swift JSON解析

作者: 恶趣味鱼 | 来源:发表于2016-07-29 16:07 被阅读242次
    • swift4 需要在build settings中把swift 3 @objc inference 设置为on

    KVCModel

    先看一段JSON数据,这是网络返回的数据

    {
        "errorCode": "SUCCESS",
        "message": "",
        "data": {
            "dict": {
                "id": 3,
                "text": "equweiyu"
            },
            "list": [{
                "headId": 0,
                "text": "aaa",
            }, {
                "headId": 1,
                "text": "bbb",
            }, {
                "headId": 2,
                "text": "ccc",
            }, ],
            "page": 0
        }
    }
    

    经过封装最后使用的效果

    // JSON 数据
    var json:AnyObject?
    //NetDataModel 
    let netData = json.flatMap(NetDataModel.init)
    //[listModel]
    let list = (netData?.data?["list"] as? [AnyObject])?.map(listModel.init)
    //DataModel
    let model = netData?.data.flatMap(DataModel.init)
    

    1. 封装一个JSON解析基类

    使用setValuesForKeysWithDictionary方法解析,很简单

    class KVCModel: NSObject {
        override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        }
        override func setValue(value: AnyObject?, forKey key: String) {
            super.setValue(value, forKey: key)
        }
        convenience init(json: [String:AnyObject]?) {
            self.init()
            json.flatMap(self.setValuesForKeysWithDictionary)
        }
        convenience init(obj:AnyObject?) {
            self.init(json: obj as? [String:AnyObject])
        }
    }
    

    但是要注意setValuesForKeysWithDictionaryInt 不友好 要使用NSNumber代替

    2. 创建Model继承于基类

    class NetDataModel:KVCModel {
        var errorCode:String?
        var data:AnyObject?
        var message:String?
    }
    class DataModel: KVCModel {
        var dict:dictModel?
        var list:[listModel]?
        var page:NSNumber?
        
        override func setValue(value: AnyObject?, forKey key: String) {
            switch key {
            case "dict":
                self.dict = value.flatMap(dictModel.init)
            case "list":
                self.list = (value as? [AnyObject])?.map(listModel.init)
            default:
                super.setValue(value, forKey: key)
            }
        }
    }
    class dictModel: KVCModel {
        var id:NSNumber?
        var text:String?
    }
    class listModel: KVCModel {
        var headId:NSNumber?
        var text:String?
    }
    

    如果Model的属性是KVCModel 或者[KVCModel] 就在 setValue(value: AnyObject?, forKey key: String) 解析

    3. 使用

    解析NetDataModel:
    let netData = json.flatMap(NetDataModel.init)

    解析[listModel]:
    let list = (netData?.data?["list"] as? [AnyObject])?.map(listModel.init)

    解析DataModel:
    let model = netData?.data.flatMap(DataModel.init)

    相关文章

      网友评论

        本文标题:Swift JSON解析

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