iOS反射:把对象直接转化成NSDictionary

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在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>@interfaceBIDObjectToNsDictionary : NSObject+ (NSDictionary*)getObjectData:(id)obj;@end

#import"BIDObjectToNsDictionary.h"#import<objc/runtime.h>

+ (NSDictionary*)getObjectData:(id)obj

{

NSMutableDictionary*dic =[NSMutableDictionary dictionary];

unsignedintpropsCount;

objc_property_t*props = class_copyPropertyList([objclass], &propsCount);//获得属性列表for(inti =0;i < propsCount; i++)

{

objc_property_t prop=props[i];

NSString*propName = [NSString stringWithUTF8String:property_getName(prop)];//获得属性的名称idvalue = [obj valueForKey:propName];//kvc读值if(value ==nil)

{

value= [NSNullnull];

}else{

value= [self getObjectInternal:value];//自定义处理数组,字典,其他类}

[dic setObject:value forKey:propName];

}returndic;

}+ (id)getObjectInternal:(id)obj

{if([obj isKindOfClass:[NSStringclass]]|| [obj isKindOfClass:[NSNumberclass]]|| [obj isKindOfClass:[NSNullclass]]

|| [obj isKindOfClass:[NSDate class]])//支持类型-----可以扩充{returnobj;

}if([obj isKindOfClass:[NSArrayclass]])

{

NSArray*objarr =obj;

NSMutableArray*arr =[NSMutableArray arrayWithCapacity:objarr.count];for(inti =0;i < objarr.count; i++)

{

[arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];

}returnarr;

}if([obj isKindOfClass:[NSDictionaryclass]])

{

NSDictionary*objdic =obj;

NSMutableDictionary*dic =[NSMutableDictionary dictionaryWithCapacity:[objdic count]];for(NSString *keyinobjdic.allKeys)

{

[dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];//对字典类型进行解析,递归调用

}returndic;

}return[self getObjectData:obj];//对其他class解析,递归调用@end

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航