在IOS的网络编程中,通常我们需要将一些实体数据保存到NSDictionary,在获得NSDictionary后即可直接使用iOS 5后的NSJSONSerialization类型的dataWithJSONObject方法就可以返回包含JSON字符串的NSData对象了。然后调用ASIHttpRequest。

如果类属性中还包含其他类,或更多的嵌套下怎么办呢,自己来编写会非常复杂,这里我们可以通过反射来编写,基本思路就是通过反射获得属性名称,通过KVC获得值,剩下的就是NSDictionary和NSArray的循环嵌套了。

IOS的反射引用<objc/runtime.h>,使用方法为class_copyPropertyList和property_getName

注意原来代码中之引用了NSString,NSNumber,NSNull类型的支持,可以加入更多的类型,根据需要添加吧我添加了NSDate类型

反射的详细介绍官方网址:点击

示例代码

#import <Foundation/Foundation.h>

@interface BIDObjectToNsDictionary : NSObject
+ (NSDictionary*)getObjectData:(id)obj;
@end
#import "BIDObjectToNsDictionary.h"
#import <objc/runtime.h>
+ (NSDictionary*)getObjectData:(id)obj
{
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
unsigned int propsCount;
objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//获得属性列表
for(int i = ;i < propsCount; i++)
{
objc_property_t prop = props[i]; NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//获得属性的名称
id value = [obj valueForKey:propName];//kvc读值
if(value == nil)
{
value = [NSNull null];
}
else
{
value = [self getObjectInternal:value];//自定义处理数组,字典,其他类
}
[dic setObject:value forKey:propName];
}
return dic;
}
+ (id)getObjectInternal:(id)obj
{
if([obj isKindOfClass:[NSString class]]
|| [obj isKindOfClass:[NSNumber class]]
|| [obj isKindOfClass:[NSNull class]]
    || [obj isKindOfClass:[NSDate class]])//支持类型-----可以扩充
{
return obj;
} if([obj isKindOfClass:[NSArray class]])
{
NSArray *objarr = obj;
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];
for(int i = ;i < objarr.count; i++)
{
[arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
}
return arr;
} if([obj isKindOfClass:[NSDictionary class]])
{
NSDictionary *objdic = obj;
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
for(NSString *key in objdic.allKeys)
{
[dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];//对字典类型进行解析,递归调用
}
return dic;
}
return [self getObjectData:obj];//对其他class解析,递归调用
@end

参考原文http://ios.9tech.cn/news/2013/0918/28899.html

最新文章

  1. 分页实现:Offset-Fetch
  2. java代理模式之静态代理
  3. canvas贝塞尔曲线 - 2
  4. 【科普】为什么WiFi自动信道选到的信道多数在1/6/11
  5. parsing XML document from class path resource
  6. 微信开发---------jsapi_ticket拿不到的问题。
  7. Unity3D 新人学习的一点感想
  8. mac 10.8 编译提示找不到GCC
  9. WPF之复杂形状控件
  10. 关于Tomcat 6的热部署和热加载
  11. 用DAEMON TOOLS打开rational ross 的bin文件并安装过程梳理
  12. 详细介绍如何使用kindEditor编辑器
  13. 秘制牛肉Alpha阶段项目展示
  14. Centos7 登录mysql 出现mysql.sock不存在
  15. Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型
  16. 有关于MVC SignalR的问题
  17. 解决终端SSH连接服务器一段时间不操作之后卡死的问题
  18. Delphi下EasyGrid使用体会
  19. c++中c_str()用法
  20. Java学习--Java 中的包装类

热门文章

  1. &lt;转&gt;大白菜的后门
  2. Python绘制分段函数
  3. Triangulation by Ear Clipping(耳切法处理多边形三角划分)
  4. DatabaseFactory.CreateDatabase 方法操作数据库
  5. 关于python ide
  6. js中级系列三:前端性能优化
  7. jQuery EasyUI DataGrid在MVC中的运用-基本属性并实现分页
  8. Redis的Aof被阻塞原因调查
  9. 【转】 Monkey测试1——Monkey的使用
  10. 探讨电子商务新的商业模式O2O