文档章节

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

CeeYang
 CeeYang
发布于 2016/11/02 14:01
字数 532
阅读 1025
收藏 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.
    }

}

 

© 著作权归作者所有

上一篇: iOS11上手体验
下一篇: SwiftClosure
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.2K
0
MJExtension Examples【示例】

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

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

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

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

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

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

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

Daniel_s
2016/01/07
418
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部