在 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. @interface Item:NSObject{
  9. @property NSString* title;
  10. @property NSNumber* id;
  11. @property NSNumber* s;
  12. }

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

  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. //**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. NSMutableArray * propertyNames = [NSMutableArray array];
  6. for (unsigned int i = 0; i < propertyCount; ++i) {
  7. objc_property_t property = properties[i];
  8. const charchar * name = property_getName(property);
  9. [propertyNames addObject:[NSString stringWithUTF8String:name]];
  10. }
  11. return propertyNames;
  12. }

拿到了属性列表之后,后面就用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. return result;<span style="font-family:Arial,Helvetica,sans-serif">}</span>

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

ios使用kvc机制简化对json的解析的更多相关文章

  1. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  2. iOS学习笔记(十一)——JSON数据解析

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  3. IOS之KVC机制(Object-C篇)

    开发环境:xcode7 一.KVC概述 1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property ...

  4. iOS高级编程之XML,JSON数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  5. iOS编程——Objective-C KVO/KVC机制[转]

    这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1.     1 ...

  6. iOS编程——Objective-C KVO/KVC机制

    来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...

  7. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  8. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  9. iOS:KVO/KVC 的概述与使用

    iOS:KVO/KVC 的概述与使用       KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...

随机推荐

  1. eclipse debug模式下总是自动跳到ThreadPoolExecutor.java类

      1.情景展示 使用eclipse,debug模式运行项目时,总是会调用这个ThreadPoolExecutor.java类,明明没有打断点却自动停止运行. 2.原因分析 在eclipse中,默认是 ...

  2. spring boot 配置动态刷新

    本文测试使用的spring cloud版本为: Dalston.SR1 很多朋友只知道spring cloud config可以刷新远程git的配置到内存中, 却不知道spring cloud con ...

  3. Qt5中表格处理大数据量

    在Qt中如果是普通项目,GUI处理展现的数据量不大,一般用QTableWidget,QTreeWidget这样的控件就满足了,但是如果数据量行数达到了几万行,那么Widget的展示性能就偏差了. Qt ...

  4. Xcode全局替换内容,一键Replace

    有时需要在整个项目里,全局修改某一段话或文字,可以这样快速实现: 1.打开查找功能 2.输入你要替换的内容 比如,我这边想全局修改作者名称 3.点击Find,会出现一个框,会有replace出来,就和 ...

  5. ajax, jQuery, jQueryeasyUI

    1.ajax与jQueryajax是jquery库里面的一个被封装好的函数,可以拿来直接使用.没有jquery的话,ajax的使用就得用原生的javascript去写,比较麻烦. 2.jQuery E ...

  6. nodejs中的exports和module.exports

    module是随文件而生的全局变量,它有exports属性,这个属性默认是一个空的字典. node的设计者画蛇添足有定义了一个exports全局变量,export指向module.exports所指向 ...

  7. K均值算法

    为了便于可视化,样本数据为随机生成的二维样本点. from matplotlib import pyplot as plt import numpy as np import random def k ...

  8. hadoop执行wordcount例子

    1:下载hadoop.http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz 2:解压. tar - ...

  9. 【struts2】自定义拦截器

    1)什么是自定义的拦截器 所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器.虽然Struts2的预定义拦截器已经满足了大多数情况的需要.但在有些时候,我们可能 ...

  10. 1.angular之Hello World

    <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/271/qrv291e ...