文档章节

swift3.0:字典转模型,JSON 转模型

CeeYang
 CeeYang
发布于 2016/11/02 14:01
字数 532
阅读 1000
收藏 1

Demo地址:https://github.com/CeeYang/3DTouch-Swift3.0

字典转模型扩展:

/** 文中的 JSON 是使用的第三方 SwiftJSON */
/** 字典转模型: json(SwiftJSON), dic(NSDictionary) */
extension NSObject {
    
    /** 只支持属性全部是 string 类型的模型,当某个属性是 NSDictionary 或者 Array 时, json[key].stringValue 会崩溃 */
    func parseData(json:JSON) {
        
        let dic = json.dictionaryValue as NSDictionary
        let keyArr:Array<String> = dic.allKeys as! Array<String>
        var propertyArr:Array<String> = []
        let hMirror = Mirror(reflecting: self)
        for case let (label?, _) in hMirror.children {
            propertyArr.append(label)
        }
        for property in propertyArr {
            for key in keyArr {
                if key == property {
                    self.setValue(json[key].stringValue, forKey: key)
                }
            }
        }
    }
    
    /** 对模型的 数组类型属性 特殊处理 */
    func parseData(json:JSON,arrayValues:Array<String>?=nil) {
        
        let dic = json.dictionaryValue as NSDictionary
        let keyArr:Array<String> = dic.allKeys as! Array<String>
        var propertyArr:Array<String> = []
        let hMirror = Mirror(reflecting: self)
        for case let (label?, _) in hMirror.children {
            propertyArr.append(label)
        }
        for property in propertyArr {
            for key in keyArr {
                if key == property {
                    for value in arrayValues! {
                        if value == property {
                            self.setValue(json[value].arrayValue, forKey: value)
                            return
                        }
                    }
                    self.setValue(json[key].stringValue, forKey: key)
                }
            }
        }
    }
    
    /**   对模型的 数组类型属性 和 description属性 特殊处理 
     *    如果后台返回的参数带有 description时候,模型创建一个description会报错,故从新给description字段命名
     *  然后后传入即可,这是我想到的方法,如果有哪位有任何高见,望赐教,谢谢.
     */
    func parseData(json:JSON,arrayValues:Array<String>?=nil,descriptionName:String?=nil) {
        
        let dic = json.dictionaryValue as NSDictionary
        let keyArr:Array<String> = dic.allKeys as! Array<String>
        var propertyArr:Array<String> = []
        let hMirror = Mirror(reflecting: self)
        for case let (label?, _) in hMirror.children {
            propertyArr.append(label)
        }
        for property in propertyArr {
            for key in keyArr {
                if key == property {
                    for value in arrayValues! {
                        if value == property {
                            self.setValue(json[value].arrayValue, forKey: value)
                            return
                        }
                    }
                    self.setValue(json[key].stringValue, forKey: key)
                }
                if property == descriptionName {
                    self.setValue(json["description"].stringValue, forKey: property)
                }
            }
        }
    }
    
    /** 支持任意类型 */
    func parseData(dic:NSDictionary) {
       
        let keyArr:Array<String> = dic.allKeys as! Array<String>
        var propertyArr:Array<String> = []
        let hMirror = Mirror(reflecting: self)
        for case let (label?, _) in hMirror.children {
            propertyArr.append(label)
        }
        for property in propertyArr {
            for key in keyArr {
                if key == property {
                    self.setValue(dic[key], forKey: key)
                }
            }
        }
    }
}

 eg:

/** 用户模型类 */
class UserInfo: NSObject {
    var name        : String?
    var id          : String?
    var phonenumber : String?
    var qq          : String?
    var enaile      : String?
    var address     : String?
}
class ModelTestController: UIViewController {

    var testDic:NSDictionary?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        /** 测试 字典 */
        testDic = ["name":"Bob",
                   "id":"6666",
                   "phonenumber":"18888888888",
                   "qq":"888888",
                   "email":"888888@qq.com",
                   "address":"广东深圳"]
        
        /** 字典转模型 */
        let userModel0 = UserInfo()
        userModel0.parseData(dic: testDic!)
        print(userModel0.name,userModel0.phonenumber)
        
        /** JSON转模型 */
        let userModel1 = UserInfo()
        let json = JSON(testDic)
        userModel1.parseData(json: json)
        print(userModel1.name,userModel1.phonenumber)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

 

© 著作权归作者所有

共有 人打赏支持
CeeYang
粉丝 7
博文 28
码字总数 26490
作品 0
深圳
程序员
MJExtension 转换速度快、使用简单方便的字典转模型框架

MJExtension A fast, convenient and nonintrusive conversion between JSON and model. 转换速度快、使用简单方便的字典转模型框架 GitHub:CoderMJLee | Blog:mjios(Chinese) | PR is ......

Daniel_s
2015/12/05
6.1K
0
MJExtension Examples【示例】

github地址:https://github.com/CoderMJLee/MJExtension 【示例】: NSDictionary -> Model 【字典转模型】 // User *user = [User objectWithKeyValues:dict]; typedef enum { } Sex; @in......

xiaobai1315
2016/09/02
23
0
从YYModel源码中可以学到什么:后篇

前言 上一篇中《从YYModel源码中可以学到什么:后篇》中主要学习了的源码结构,只是分享了整体结构。 承接上篇,本文将解读如何进行JSON模型转换的,接下来一起揭开的神秘面纱吧! 目录 JSON...

Owenli_千
2017/12/29
0
0
iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

本文实验Demo传送门:DictToModelDemo 前言:将后台JSON数据中的字典转成本地的模型,我们一般选用部分优秀的第三方框架,如SBJSON、JSONKit、MJExtension、YYModel等。但是,一些简单的数据...

陈满iOS
05/08
0
0
跟着MJExtension实现简单的字典转模型框架 - 简书

演示代码地址:https://github.com/codeWillwillCode/LearnMJExtension 最简单的字典 首先,从最简单的字典开始. NSDictionary *dict = @{ @"name" : @"Jack", @"icon" : @"lufy.png", @"age" ......

Daniel_s
2016/01/07
392
0

没有更多内容

加载失败,请刷新页面

加载更多

hive数据导入导出

- 导入主要方式 load从本地加载 load从hdfs中加载 insert into方式加载 location指定源数据路径 like指定、克隆 ctas语句指定(create table tableName as ...) 手动将数据copy到表目录 5、 ...

Mr_yul
11分钟前
0
0
基于基线版本新建分支,并合并之前未合并到基线版本的分支

`合并feature2到feature5继续开发 git checkout -b feature2 origin/feature2 git pull git checkout -b baseline origin/baseline git pull git checkout -b feature5 git merge feature2 ......

philonic
19分钟前
0
0
统一认证服务CAS 5安装

简要介绍统一认证服务(CAS,Central Authentication Service,注:常称为单点登录系统)5.2.X的安装及配置。 CAS环境:Centos7.5+Tomcat8.5+jdk-8u181。后台用户管理采用openldap,其安装请...

阿笨哥
19分钟前
0
0
多线程糗事百科案例

爬取糗事百科段子,假设页面的URL是:http://www.qiushibaike.com/8hr/page/1 要求 1.使用requests获取页面信息,用XPath / re 做数据提取 2.获取每个帖子里的用户头像链接、用户姓名、段子内...

代码打碟手
22分钟前
0
0
09-《深度拆解JVM》JVM是怎么实现invokedynamic的?(上)

一、问题引入 前不久,“虚拟机”赛马俱乐部来了个年轻人,标榜自己是动态语言,是先进分子。 这一天,先进分子牵着一头鹿进来,说要参加赛马。咱部里的老学究 Java 就不同意了呀,鹿又不是马...

飞鱼说编程
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部