首页 » IOS » ios使用kvc机制简化对json的解析

ios使用kvc机制简化对json的解析

2015-11-25 13:10:37阅读(349)

原文地址:http://www.cnblogs.com/ios8/p/ios-kvc-json.html

在 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

  1. @interfaceResult:NSObject{
  2. @propertyNSNumber*totalPage;
  3. @propertyNSNumber*page;
  4. @propertyNSString*desc;
  5. @propertyNSArray*items;
  6. }
  7. @end
  8. @interfaceItem:NSObject{
  9. @propertyNSString*title;
  10. @propertyNSNumber*id;
  11. @propertyNSNumber*s;
  12. }

在解析的时,一般我是这么做的

  1. +(result*)resultWithDict:(NSDictory*)dict{
  2. Result*r=[Resultalloc]init];
  3. r.totalPage=[dictobjectForKey:@"totalPage"];
  4. r.page=[dictobjectForKey:@"page"];
  5. r.desc=[dictobjectForKey:@"desc"];
  6. r.items=[itemitemsWithArray:[dictobjectForKey:items]];
  7. }
  8. //**item的解析类似上面的写法


在定义interface的时候我们默默的写了一次属性名称,接着我们在解析的时候还要进行无聊的操作。不累吗。对于简单的json结构,我们还是可以忍受的,那么对那些负责的结构呢,苦逼的人民啊!!

好吧进入主题,object c的动态性给我们造福不少,kvc和kvo机制都相当的不错,必须赞一个,可以说是完胜了cpp啊。我们使用object 的runtime和kvc机制把我们简化代码。不过这里有些事情是必须要统一的,那就是属性的命名规则必须和json的key一致(可以忽略大小写和_),为啥呢,因为kvc需要这样子,要不然就会出问题的。

首先,我们要知道自己的object有哪些property 名称列表了,这样才好从json的词典中哪数据啊。下面就是获取一个object中的property name list了。

  1. NSArray*getPropertyNameList(idobject)
  2. {
  3. unsignedintpropertyCount=0;
  4. objc_property_t*properties=class_copyPropertyList([objectclass],&propertyCount);
  5. NSMutableArray*propertyNames=[NSMutableArrayarray];
  6. for(unsignedinti=0;i<propertyCount;++i){
  7. objc_property_tproperty=properties[i];
  8. constcharchar*name=property_getName(property);
  9. [propertyNamesaddObject:[NSStringstringWithUTF8String:name]];
  10. }
  11. returnpropertyNames;
  12. }


拿到了属性列表之后,后面就用kvc的机制来搞定吧。

  1. +(Result*)resultWithDict:(NSDictory*)dict{
  2. Result*r=[[Resultalloc]init];
  3. NSArray*propertyArray=getPropertyNameList(result);
  4. for(NSString*keyinpropertyArray){
  5. @try{
  6. NSLog(@"%@:%@,%@",key,dict[key],NSStringFromClass([dict[key]class]));
  7. if([keyisEqual:@"items"]){
  8. [resultsetValue:[ItemitemsWitdhArray:dict[key]]forKey:key];
  9. }else{
  10. [resultsetValue:dict[key]forKey:key];
  11. }
  12. }@catch(NSException*exception){
  13. NSLog(@"except:%@:%@",key,dict[key]);
  14. }
  15. }
  16. returnresult;<spanstyle="font-family:Arial,Helvetica,sans-serif">}</span>

哎呀,貌似这个代码比上面的要复杂的多了。哈哈,说的没有错。这个代码可以用作基类或者对复杂的json结构是相当有用的。不过有一点需要注意的,用这种方式必然会降低性能的,追求性能极致的朋友还是不要用这个方法了。


最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹