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,它提供一种机制,当指定的对象的属性 ...
随机推荐
- 单链表Java实现
近期在复习基本数据结构,本文是单链表的Java实现,包含对单链表的实现插入删除查找遍历等.最后还实现了单链表的逆置. 实现了多项式相加,多项式相乘. 原文章及完整源码在这里 http://binhua ...
- 〖Linux〗Linux高级编程 - 进程间通信(Interprocess Communication)
[转自: http://blog.csdn.net/Paradise_for_why/article/details/5550619] 这一章就是著名的IPC,这个东西实际的作用和它的名字一样普及.例 ...
- 【Linux】shell数组
一.概念 shell数组就是一个元素集合,它把有限个元素用一个名字来命名,然后用编号对他们分区.这个名字称为数组名,用于区分不同内容的编号称为数组的下标. 二.shell数组的定义与增删改查 1.sh ...
- visual studio运行时库MT、MTd、MD、MDd的研究
在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT.MTd.MD.MDd有什么关系呢?这是 ...
- maven正确的集成命令-U-B
http://healthandbeauty.iteye.com/blog/1618501 在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean i ...
- 转:TCP/IP协议栈的基本工作原理
转载自:http://jasonccie.blog.51cto.com/2143955/422966 TCP/IP是互联网的核心协议,也是大多数网络应用的核心协议.就前面一段时间面试中问到的TCP/I ...
- 【laravel5.*】详解laravel中的依赖注入
1.下面这个是自定义的类,钉钉扫码登录web 网页授权OAuth2.0,是一个典型的依赖注入参考示例:
- CentOS SVN客户端应用
一.CentOS安装TortoiseSVN yum install -y subversion 二.SVN客户端命令 1.将文件checkout到本地目录 svn checkout path( ...
- sqlserver修改为windows验证登陆, 程序的调整
业务需求, 客户要求sqlserver改为windows验证登陆, sa用户不可用, 程序端如何修改呢? 我在本机做了个测试. 环境: sqlserver2016, springmvc+spring+ ...
- tensorflow代码中的一个bug
tensorflow-gpu版本号 pip show tensorflow-gpu Name: tensorflow-gpu Version: 1.11.0 Summary: TensorFlow i ...