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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,682评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,277评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,083评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,763评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,785评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,624评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,358评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,261评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,722评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,900评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,030评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,737评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,360评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,941评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,057评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,237评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,976评论 2 355

推荐阅读更多精彩内容