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


    在 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. @interface Result:NSObject{  
    2. @property NSNumber* totalPage;  
    3. @property NSNumber* page;  
    4. @property NSString* desc;  
    5. @property NSArray* items;  
    6. }  
    7. @end  
    8.   
    9. @interface Item:NSObject{  
    10. @property NSString* title;  
    11. @property NSNumber* id;  
    12. @property NSNumber* s;  
    13. }  

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

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


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

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

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

     
    1. NSArray * getPropertyNameList(id object)  
    2. {  
    3.     unsigned int propertyCount = 0;  
    4.     objc_property_t * properties = class_copyPropertyList([object class], &propertyCount);  
    5.       
    6.     NSMutableArray * propertyNames = [NSMutableArray array];  
    7.     for (unsigned int i = 0; i < propertyCount; ++i) {  
    8.         objc_property_t property = properties[i];  
    9.         const charchar * name = property_getName(property);  
    10.         [propertyNames addObject:[NSString stringWithUTF8String:name]];  
    11.       
    12.     }  
    13.       
    14.     return propertyNames;  
    15. }  


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

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

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

  • 相关阅读:
    Vue.js —— 关闭eslint校验
    彻底搞懂 module.exports/exports/import/export/export default
    JS 中的原型和原型链
    TypeScript-初级-08-声明合并
    TypeScript-初级-07-泛型
    TypeScript-初级-06-类与接口
    TypeScript-初级-05-类
    TypeScript-初级-04-枚举
    TypeScript-初级-03-元组
    TypeScript-初级-02-字符串字面量类型
  • 原文地址:https://www.cnblogs.com/ios8/p/ios-kvc-json.html
Copyright © 2020-2023  润新知