ios使用kvc机制简化对json的解析
2013-11-06 10:43
274 查看
在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪。tmd都是一样的东西,要为每个property赋值,真是累人啊。举个简单的例子吧。服务器会过来的数据是:
{totalPage:100,page:2,desc:"xxxx",items:{[title:"mb",id:1000,s:111],[title:"ob",id:22,s:8]}}
这个结构还是蛮简单的吧。一般我们我们需要2个对象,一个是Result的对象,还有一个是数组中的子对象 Item
@interface Result:NSObject{
@property NSNumber* totalPage;
@property NSNumber* page;
@property NSString* desc;
@property NSArray* items;
}
@end
@interface Item:NSObject{
@property NSString* title;
@property NSNumber* id;
@property NSNumber* s;
}
在解析的时,一般我是这么做的
+(result*)resultWithDict:(NSDictory*)dict{
Result* r = [Result alloc]init];
r.totalPage = [dict objectForKey:@"totalPage"];
r.page = [dict objectForKey:@"page"];
r.desc = [dict objectForKey:@"desc"];
r.items = [item itemsWithArray: [dict objectForKey:items]];
}
//**item的解析类似上面的写法
在定义interface的时候我们默默的写了一次属性名称,接着我们在解析的时候还要进行无聊的操作。不累吗。对于简单的json结构,我们还是可以忍受的,那么对那些负责的结构呢,苦逼的人民啊!!
好吧进入主题,object c的动态性给我们造福不少,kvc和kvo机制都相当的不错,必须赞一个,可以说是完胜了cpp啊。我们使用object 的runtime和kvc机制把我们简化代码。不过这里有些事情是必须要统一的,那就是属性的命名规则必须和json的key一致(可以忽略大小写和_),为啥呢,因为kvc需要这样子,要不然就会出问题的。
首先,我们要知道自己的object有哪些property 名称列表了,这样才好从json的词典中哪数据啊。下面就是获取一个object中的property name list了。
NSArray * getPropertyNameList(id object)
{
unsigned int propertyCount = 0;
objc_property_t * properties = class_copyPropertyList([object class], &propertyCount);
NSMutableArray * propertyNames = [NSMutableArray array];
for (unsigned int i = 0; i < propertyCount; ++i) {
objc_property_t property = properties[i];
const charchar * name = property_getName(property);
[propertyNames addObject:[NSString stringWithUTF8String:name]];
}
return propertyNames;
}
拿到了属性列表之后,后面就用kvc的机制来搞定吧。
+(Result*)resultWithDict:(NSDictory*)dict{
Result* r = [[Result alloc] init];
NSArray* propertyArray = getPropertyNameList(result);
for (NSString* key in propertyArray) {
@try{
NSLog(@"%@:%@,%@",key,dict[key],NSStringFromClass([dict[key] class]));
if([key isEqual:@"items"]){
[result setValue:[Item itemsWitdhArray:dict[key]] forKey:key];
}else{
[result setValue:dict[key] forKey:key];
}
}@catch (NSException *exception) {
NSLog(@"except:%@:%@",key,dict[key]);
}
}
return result;<span style="font-family:Arial,Helvetica,sans-serif">}</span>
哎呀,貌似这个代码比上面的要复杂的多了。哈哈,说的没有错。这个代码可以用作基类或者对复杂的json结构是相当有用的。不过有一点需要注意的,用这种方式必然会降低性能的,追求性能极致的朋友还是不要用这个方法了。
{totalPage:100,page:2,desc:"xxxx",items:{[title:"mb",id:1000,s:111],[title:"ob",id:22,s:8]}}
这个结构还是蛮简单的吧。一般我们我们需要2个对象,一个是Result的对象,还有一个是数组中的子对象 Item
@interface Result:NSObject{
@property NSNumber* totalPage;
@property NSNumber* page;
@property NSString* desc;
@property NSArray* items;
}
@end
@interface Item:NSObject{
@property NSString* title;
@property NSNumber* id;
@property NSNumber* s;
}
在解析的时,一般我是这么做的
+(result*)resultWithDict:(NSDictory*)dict{
Result* r = [Result alloc]init];
r.totalPage = [dict objectForKey:@"totalPage"];
r.page = [dict objectForKey:@"page"];
r.desc = [dict objectForKey:@"desc"];
r.items = [item itemsWithArray: [dict objectForKey:items]];
}
//**item的解析类似上面的写法
在定义interface的时候我们默默的写了一次属性名称,接着我们在解析的时候还要进行无聊的操作。不累吗。对于简单的json结构,我们还是可以忍受的,那么对那些负责的结构呢,苦逼的人民啊!!
好吧进入主题,object c的动态性给我们造福不少,kvc和kvo机制都相当的不错,必须赞一个,可以说是完胜了cpp啊。我们使用object 的runtime和kvc机制把我们简化代码。不过这里有些事情是必须要统一的,那就是属性的命名规则必须和json的key一致(可以忽略大小写和_),为啥呢,因为kvc需要这样子,要不然就会出问题的。
首先,我们要知道自己的object有哪些property 名称列表了,这样才好从json的词典中哪数据啊。下面就是获取一个object中的property name list了。
NSArray * getPropertyNameList(id object)
{
unsigned int propertyCount = 0;
objc_property_t * properties = class_copyPropertyList([object class], &propertyCount);
NSMutableArray * propertyNames = [NSMutableArray array];
for (unsigned int i = 0; i < propertyCount; ++i) {
objc_property_t property = properties[i];
const charchar * name = property_getName(property);
[propertyNames addObject:[NSString stringWithUTF8String:name]];
}
return propertyNames;
}
拿到了属性列表之后,后面就用kvc的机制来搞定吧。
+(Result*)resultWithDict:(NSDictory*)dict{
Result* r = [[Result alloc] init];
NSArray* propertyArray = getPropertyNameList(result);
for (NSString* key in propertyArray) {
@try{
NSLog(@"%@:%@,%@",key,dict[key],NSStringFromClass([dict[key] class]));
if([key isEqual:@"items"]){
[result setValue:[Item itemsWitdhArray:dict[key]] forKey:key];
}else{
[result setValue:dict[key] forKey:key];
}
}@catch (NSException *exception) {
NSLog(@"except:%@:%@",key,dict[key]);
}
}
return result;<span style="font-family:Arial,Helvetica,sans-serif">}</span>
哎呀,貌似这个代码比上面的要复杂的多了。哈哈,说的没有错。这个代码可以用作基类或者对复杂的json结构是相当有用的。不过有一点需要注意的,用这种方式必然会降低性能的,追求性能极致的朋友还是不要用这个方法了。
相关文章推荐
- ios使用kvc机制简化对json的解析
- 使用kvc机制简化对json的解析
- iOS Json解析框架之MJExtension使用详解(转)
- IOS 网络JSon解析使用框架
- 8、使用Struts2实现异步调用机制剖析(XML与JSON方式解析)
- iOS:使用YYModel实现本地JSON文件解析
- IOS--JSON解析之JSONKit使用
- iOS 使用SBJSON创建和解析JSON
- 关于iOS中几种第三方对XML/JSON数据解析的使用
- iOS- JSon和Xml解析,与服务器交互数据的解析详解与使用,各种解析方式详解
- iOS开发1-使用NSJSONSerialization解析JSON数据
- ios 中使用SBJson拼接和解析json
- 关于iOS中几种第三方对XML/JSON数据解析的使用
- iOS 使用SBJSON创建和解析JSON
- ios-使用NSJSONSerialization解析JSON文件
- iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
- iOS网络编程4--使用SwiftyJSON解析JSON数据
- ios 中使用SBJson拼接和解析json
- Objective-C ,ios,iphone开发基础:JSON解析(使用苹果官方提供的JSON库:NSJSONSerialization)
- iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换