ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据
2015-12-29 13:41
417 查看
原理:
0.创建一个新的可变字典:NSMutableDictionary
1.采用class_copyPropertyList函数遍历对象的属性
2.property_getName获取属性名,valueForKey获取属性内容。
3.判断该属性内容的Class:
(1)假如为基础类型(NSString,NSNumber,NSNull),则直接返回,跳转到4操作。
(2)假如为数组类型,先创建新的可变数组,再遍历旧数组中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。
通过setObject atIndexedSubscript方法,把旧数组内容编码后转移到新可变数组,全部完成后把它返回给外层容器。
(3)假如为字典类型,先创建新的可变字典,再遍历旧字典中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。
通过setObject forKey方法,把旧字典里内容编码后转移到新可变字典,全部完成后把它返回给外层容器。
4.对最外层可变数组容器,使用setObject forKey对所有属性进行赋值。
PS:
其实说白了,转JSON的过程只是把对象里的自定义成分转变成NSMutableArray或NSMutableDictionary(可变才能添加)的过程,因为他们都是按Key-Value编码的数据模型,所以只需要再通过一句话就能转成JSON的字符串了。
这里用到Runtime是因为Runtime能按批遍历对象,否则你就要对不同对象按.xxx来访问他的属性,再setValue forKey到新字典。Runtime省了不少力。
demo: https://github.com/rayshen/GIReflectionCodeDemo
0.创建一个新的可变字典:NSMutableDictionary
1.采用class_copyPropertyList函数遍历对象的属性
2.property_getName获取属性名,valueForKey获取属性内容。
3.判断该属性内容的Class:
(1)假如为基础类型(NSString,NSNumber,NSNull),则直接返回,跳转到4操作。
(2)假如为数组类型,先创建新的可变数组,再遍历旧数组中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。
通过setObject atIndexedSubscript方法,把旧数组内容编码后转移到新可变数组,全部完成后把它返回给外层容器。
(3)假如为字典类型,先创建新的可变字典,再遍历旧字典中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型。
通过setObject forKey方法,把旧字典里内容编码后转移到新可变字典,全部完成后把它返回给外层容器。
4.对最外层可变数组容器,使用setObject forKey对所有属性进行赋值。
PS:
其实说白了,转JSON的过程只是把对象里的自定义成分转变成NSMutableArray或NSMutableDictionary(可变才能添加)的过程,因为他们都是按Key-Value编码的数据模型,所以只需要再通过一句话就能转成JSON的字符串了。
这里用到Runtime是因为Runtime能按批遍历对象,否则你就要对不同对象按.xxx来访问他的属性,再setValue forKey到新字典。Runtime省了不少力。
demo: https://github.com/rayshen/GIReflectionCodeDemo
相关文章推荐
- 轻松学习JavaScript二十八:DOM编程学习之事件处理函数
- 利用vnet在wifi局域网中模拟一个能返回json的服务器
- JS跨域调用之JSONP--动态Script标签方式实现跨域
- JS 正则表达式应用
- JavaScript学习 二、基础
- javascript跨域获取json数据
- js解决中文乱码
- js类、原型——学习笔记
- jsp中div遍历list集合
- JS实例操作QQ空间自动点赞方法
- JS判断当前使用的是哪个浏览器及其版本
- Drupal 引入JS文件的几种方式
- highcharts 绘制图标的JAVASCRIPT 类库 收藏
- Js 模拟鼠标点击事件
- JS获取浏览器信息
- JS表情替换代码,这里使用字符代替图片路径
- JS正则匹配中文
- JS 中 indexOf 的用户及注意事项
- JS 去除字符串中的最后一个字符
- Json基本概念