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
- @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的解析的更多相关文章
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
- iOS学习笔记(十一)——JSON数据解析
在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...
- IOS之KVC机制(Object-C篇)
开发环境:xcode7 一.KVC概述 1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property ...
- iOS高级编程之XML,JSON数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- iOS编程——Objective-C KVO/KVC机制[转]
这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1. 1 ...
- iOS编程——Objective-C KVO/KVC机制
来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...
- 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. ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- iOS:KVO/KVC 的概述与使用
iOS:KVO/KVC 的概述与使用 KVO APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...
随机推荐
- springMVC自定义方法属性解析器
使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@Model ...
- 通过ribbon 根据服务名获取所有服务实例的IP和端口列表
代码使用SpringCloud版本E3 业务场景: 今天遇到一个业务场景,要求根据服务名获取当前微服务集群中所有的对应服务实例的IP和端口,通过分析源码推算出了写法. 原理简述: 如果代码中引入了sp ...
- code vs 1013 求先序排列
2001年NOIP全国联赛普及组 题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input De ...
- Retrofit使用指南
Retrofit is a type-safe HTTP client for Android and Java. Retrofit是面向Android和Java平台的一个类型安全的HTTP客户端. ...
- 图像检索:一维直方图+欧几里得距离+flann+KNN
在F盘生成了一个文件名称为"文件夹"的文本文件. 第一步:批处理提取图像的一维颜色直方图,并保存到.xml中的featureHists 第一个參数:图像的路径 第二个參数:保存的. ...
- git pull时冲突的几种解决方式
仅结合本人使用场景,方法可能不是最优的 1. 忽略本地修改,强制拉取远程到本地 主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉 git fetch --a ...
- Axure快速原型教程01--原型说明下载和安装
Axure是一个快速画原型的工具 什么是原型? 估计进来的朋友应该都清楚,原型通俗来讲,不仅仅是在软件开发中使用,在很多行业中也需要用的,比如服装设计,建筑 ...
- java日期格式(年月日时分秒毫秒)
package test.remote.tools.combine; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...
- keras embeding设置初始值的两种方式
随机初始化Embedding from keras.models import Sequential from keras.layers import Embedding import numpy a ...
- Android开发环境——SDK相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT相关 ...