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