美文网首页iOS开发技能iOS开发iOS开发-swift语言
Swift 尝试写一个库Json转model--ZZJModel

Swift 尝试写一个库Json转model--ZZJModel

作者: smalldu | 来源:发表于2016-01-23 00:26 被阅读4088次

    库是为了把一些繁琐的操作变的更简单,说白了就是封装。

    Json转Model 也有一些库了,我写这个简单的库就练练手,其他库我也没用过,(项目中还是半自动,手写转的)。

    简单介绍下ZZJModel,就是将Json类型的数据一行代码转成对象。对json不了解的 自行google。

    这里有一组json

    {
        "code": 0,
        "msg": "",
        "result": {
            "room": {
                "id": "5",
                "uid": "78",
                "house": 0,
                "start_time": "2015-11-28",
                "city": "上海",
                "region": "长宁",
                "address": "仁达商务楼",
                "summary": "祖安求辅助",
                "pricemin": 3000,
                "moneymin": 2000,
                "longitude": "121.43660700",
                "latitude": "31.21492900",
                "comment_count": 19,
                "photo_count": 7,
                "subway_station": "交通大学",
                "subway_line": "11号线",
                "status": 0,
                "format_time": "11-27",
                "create_time": "04-13",
                "last_modify_time": "2015-11-27 18:33:51",
                "dateDetail": "11月28日入住",
                "pricesection": "预算 2000",
                "cost1": 2000,
                "cost2": null,
                "localization": "长宁 11号线 交通大学",
                "content": "祖安求辅助"
            },
            "content": {
                "id": "5",
                "content": "祖安求辅助",
                "show_content": true
            },
            "show_content": 1233
        }
        ,
        "station": [
                    "富锦路",
                    "友谊西路",
                    "宝安公路",
                    "共富新村",
                    "呼兰路",
                    "通河新村",
                    "共康路",
                    "彭浦新村",
                    "汶水路",
                    "上海马戏城",
                    "延长路",
                    "中山北路",
                    "上海火车站",
                    "汉中路",
                    "新闸路",
                    "人民广场",
                    "黄陂南路",
                    "陕西南路",
                    "常熟路",
                    "上海图书馆",
                    "衡山路",
                    "徐家汇",
                    "上海体育馆",
                    "漕宝路",
                    "上海南站",
                    "锦江乐园",
                    "莲花路",
                    "外环路",
                    "莘庄"
                    ]
        ,"items":[
                 {
                 "id": "5",
                 "content": "测试1",
                 "show_content": true
                 },
                 {
                 "id": "6",
                 "content": "测试2",
                 "show_content": true
                 },
                 {
                 "id": "7",
                 "content": "测试3",
                 "show_content": false
                 }
        ]
    }
    

    这是一段比较复杂的json,这组json看来 整体是一个对象 中间还有一个room对象和content对象。 还有一个数组 一个对象数组 , 手动转肯定要写很多for循环。那么 我这个库呢?

    首先 读取JSON,我这些字串放在.json文件中,用SwiftyJSON读取, 后面我有可能会直接考虑加上data转model 现在不会加

     if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json"){
                let data:NSData?
                do {
                    data = try NSData(contentsOfFile: path, options: NSDataReadingOptions())
                    let json = JSON(data:data!)
                    //任意对象的模型转json  必须是dic
                    let all = ZZAll.zz_objToModel(json.object) as ZZAll  //这里需要转一下
                    print(all.result?.room?.address)    
                    
                    if let dic = json.dictionaryObject{
                        
                        let all1 = ZZAll.zz_dicToModel(dic) as ZZAll  //这里需要转一下
                        print(all1.result?.content?.id)
    
                    }
                    
                }catch let err {
                    debugPrint(err)
                }
            }
    

    除了获取json数据的方法 字典转模型 就一句话
    let all = ZZAll.zz_objToModel(json.object) as? ZZAll

    或者

    let all1 = ZZAll.zz_dicToModel(dic) as? ZZAll

    这样就可以打印对象中的信息 包括对象中的对象的属性
    print(all?.result?.room?.address)

    有两种调用方式 一种是传入AnyObject 一种是传入[String:AnyObject]

    git上大多数库的model都是要继承第三方JSON转Model的库的 ,我们这里 不用

    model

    /// 所有信息
    class ZZAll: NSObject{
        
        //MARK: - 属性定义
        var code:NSNumber?
        var msg:String?
        var result:ZZResult?
        var station:[String]?
        var items:[ZZContent]?
        
        /**
         根据Key获取实体相关信息
         
         - returns: 字典
         */
        override func zz_modelPropertyClass()->[String:AnyClass]?{
            return ["result":ZZResult.self,"items":ZZContent.self]  //传入对应类型
        }
        
    }
    

    如果有对象属性 需要重写zz_modelPropertyClass方法 返回key,value

    就这样把所有model 写出来就行了。

    /// 结果信息
    class ZZResult: NSObject{
        
        //MARK: - 属性定义
        var show_content:NSNumber?
        var content:ZZContent?
        var room:ZZRoom?
        
    
        override func zz_modelPropertyClass()->[String:NSObject]?{
            return ["room":ZZRoom.self,
                    "content":ZZContent.self]
        }
    }
    
    
    /// 内容信息
    class ZZContent: NSObject{
        
        //MARK: - 属性定义
        var id:NSNumber?
        var content:String?
        var show_content:Bool?    
    }
    

    Room 比较雷同 属性较多久不贴了

    目前库还有点问题 ,没办法处理Bool类型,setValue不能给他赋值,objc_setAssociatedObject也没用 。Bool对应的对象类型是NSNumber 这块还在考虑怎么处理 。如果谁有好的idea,点一下 ,不胜感激!

    那么怎么实现的呢,也很简单就一个文件

    贴图

    总共就200多行代码 ,感兴趣的同学可以看看。

    git地址:https://github.com/smalldu/ZZJModel

    相关文章

      网友评论

      • xycn:总觉得在Swift糅合使用Objective-C的类很不爽,为此我也写了个轮子,它可以对纯Swift类做序列化/反序列化,也不需要自己重载赋值函数。可以交流下~

        https://github.com/alibaba/HandyJSON
      • 嗷呜_:兄弟,这只是能用而已,性能比简单的反射还差好多好多...
        smalldu:@嗷呜_ 这个没测试过……
        嗷呜_:@嗷呜_ 我也想写个轮子,测试你这个一万条,用了8秒多,数据少没问题,但是优化空间还很大啊
        smalldu:@嗷呜_ 总体就是递归加kvc性能有什么问题?
      • d15b74150f7e:感觉还是oc老方法转成swift用
      • Dream_Maker:刀哥,是你吗
        smalldu:@Dream_Maker 谢谢
        Dream_Maker:@大石头布 好吧,你的文章写的真棒!
        smalldu:@Dream_Maker 不是……
      • 懒懒加1:这个点居然还发表

      本文标题:Swift 尝试写一个库Json转model--ZZJModel

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