一种自动的将自定义类序列化为JSON的方法
来源:互联网 发布:域名的保护问题案例 编辑:程序博客网 时间:2024/06/15 08:56
最近因为项目需求,需要将一些自定义的类序列化为JSON,网上有很多好用的第三方序列化工具,但都只能自动序列化一些基本类型,如NSNumber,NSString与NSDictionary这种,没有一种第三方工具提供直接将自定义类序列化的方法(至少据我所知:),而对于这种序列化自定义的类的需求,网上能查到的方法只有将自定义的类手动的转存为一个NSDictionary,然后再使用第三方工具来序列化。例如对于一个类Foo,有如下定义:
![](http://static.oschina.net/uploads/img/201202/29133408_3XSD.jpg)
![](http://static.oschina.net/uploads/img/201202/29133408_YqMD.png)
要序列化它的方法只有:
![](http://static.oschina.net/uploads/img/201202/29133408_u7Ui.png)
这种方法的缺陷在于太不灵活,每一次序列化的时候都需要写很多重复的代码 ,上面的代码还没有考虑属性值为nil的情况(因为当属性值为nil时,NSDictionary会认为初始化结束)。因为在JAVA中有工具通过反射机制可以实现自动的序列化自定义类,于是抱着试一试的心态,开始寻找Objective-C中对应的方法。功夫不负苦心人,一位stackoverflow上的仁兄的回复提醒了我,iOS中的有Runtime Programming这样一种技术,通过阅读相应的文档,最终我找到了解决的方法。
iOS的Runtime Programming中提供了一系列强大的方法在运行时对类进行操作,比如获取类的属性信息,类的协议信息,甚至是修改,增加,删除类的方法。对于我的需求而言,能够获取类的所有属性信息已经足够了。实际上我们需要解决的问题 ,就是动态的获取一个类中所有的属性名,只要能够获取这个,再通过这些属性名找到对应的属性值,最终把这些名-值建立成对,放入一个NSDictionary中,就可以使用第三方工具完成序列化的工作了。
想到这里,可以说要做什么已经清楚了,接下来就是实干!我用苹果 的官方文档给的例子,写了一个获取一个类所有属性名的方法:
iOS的Runtime Programming中提供了一系列强大的方法在运行时对类进行操作,比如获取类的属性信息,类的协议信息,甚至是修改,增加,删除类的方法。对于我的需求而言,能够获取类的所有属性信息已经足够了。实际上我们需要解决的问题 ,就是动态的获取一个类中所有的属性名,只要能够获取这个,再通过这些属性名找到对应的属性值,最终把这些名-值建立成对,放入一个NSDictionary中,就可以使用第三方工具完成序列化的工作了。
想到这里,可以说要做什么已经清楚了,接下来就是实干!我用苹果 的官方文档给的例子,写了一个获取一个类所有属性名的方法:
![](http://static.oschina.net/uploads/img/201202/29133409_DODG.png)
我们知道,对于一个定义了@property的NSObject来说,只要调用与属性名相同名字的方法,便可以得到这个属性的值,如:[foo property1];会返回 @"haha" ,为了获取对应属性的值,我们只要把属性的名字用NSSelectorFromString()方法转换成selector,然后让这个类foo来调用就可以了。
至此,可以说所有的难点都解决了,接下来就是把这个些东西组合起来,来生成NSDictionary了。下面的很简单,我就不写了:)
最终序列化的代码如下:
![](http://static.oschina.net/uploads/img/201202/29133409_Rvjv.png)
这里主要是提供一种思路,可能这种解决方法还会有些欠缺的地方,希望可以和大家一起讨论下。内容可能写的有点糙,如果有相关问题,欢迎留言询问。
补充一点,这个方法我不确定能否通过苹果的审核,不过既然苹果的文档让用,我觉得应该没什么问题。
补充一点,这个方法我不确定能否通过苹果的审核,不过既然苹果的文档让用,我觉得应该没什么问题。
附附件:
JSONAutoSerializer.zip (116 K)
![](http://static.oschina.net/uploads/img/201202/29133409_dCQx.gif)
原帖地址: http://www.cocoachina.com/bbs/read.php?tid=86667
- 一种自动的将自定义类序列化为JSON的方法
- 一种自动的将自定义类序列化为JSON的方法
- 一种自动的将自定义类序列化为JSON的方法
- 一种自动的将自定义类序列化为JSON的方法
- 工具方法,可以将指定的表单中的输入项目序列化为json数据
- JS对象序列化为JSON对象的方法
- Jquery 将表单序列化为Json对象.同时提交多个表单的参数
- js将form内的表单序列化为json字符串、数组、对象
- Jquery 将表单序列化为Json对象.同时提交多个表单的参数
- 【FCL】将实体类序列化为xml,Json等格式
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象
- 将DataTable序列化为Json格式
- Jquery 将表单序列化为Json对象
- Jquery 将表单序列化为Json对象
- Jquery 将表单序列化为Json对象
- Jquery 将表单序列化为Json对象
- Jquery 将表单序列化为Json对象
- 将表单序列化为json字符串
- 如何在ASP.net中实现限制一个用户名在多个客户端IE登陆的方法
- JavaScript 变量
- SQLite简介
- Java 随手笔记(入门篇)_ 1
- JavaScript 运算符
- 一种自动的将自定义类序列化为JSON的方法
- JavaScript 比较和逻辑运算符
- Android 视频播放 MediaPlayer
- JavaScript If...Else 语句
- JavaScript Switch 语句
- 键盘按键键值--开发实用
- JavaScript 消息框
- 7次比较,对5个数进行排序
- JavaScript 函数