1.简单的KVC介绍

KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。

之前的一篇博客(http://www.cnblogs.com/rayshen/p/5006619.html),在探讨如何把某个对象进行序列化的时候,其实已经使用到KVC,如果某个类遵循NSCoding协议就能编码成NSData*(字节流)。

具体KVC使用的示例为:

Persion *persion =  [ [Persion alloc] init ];
//不使用KVC
persion.name = @"shen" ;
//使用KVC的写法
[persion setValue:@"shen" forKey:@"name"];

上面是利用KVC访问类里的某个属性,下面利用KVC直接访问类里的类里的某个属性

//不使用KVC
Persion *persion = [ [Persion alloc] init ];
Phone *phone = persion.phone;
Battery *battery = phone.battery;
//使用KVC
Battery *battery = [persion valueForKeyPath: @"phone.battery" ];

2.自定义Class实现快速反序列化

-(id)initWithDictionary:(NSDictionary *)dic{
if(dic){
if(self=[super init]){
unsigned int outCount=0;
//获得该class所有property的key的数组,和property总数
objc_property_t * const properties=class_copyPropertyList([self class], &outCount);
if(outCount>0){
for(int i=0;i<outCount;i++){
//属性名转换成NSString
NSString *propertyName = [NSString stringWithCString:property_getName(properties[i]) encoding:NSUTF8StringEncoding];
//根据属性名,从字典从取出内容
id value=[dic objectForKey:propertyName];
if(value){
//利用setValue快速赋值
[self setValue:value forKey:propertyName];
}
}
}
return self;
}
}
return nil;
}

上面的代码进行JSON反序列化成对象的方式的缺点是:

1.无法进行嵌套对象的反序列化(进行递归封装后就可以实现了)。

2.必须保持JSON的Key和Property名是一致的。

3.对象内容不易修改,默认为NSArray和NSDictionary,都是不可变的数组和字典。后期操作比较麻烦。

ObjC 巧用反射和KVC实现JSON快速反序列化成对象的更多相关文章

  1. JSON字符串反序列化成对象_部分属性值反序列化失败

    简介:本人在开发webapi接口时遇到了:一个复杂的Json字符串在反序列化为对象时报,无法发序列化其中的一个属性对象? 使用方法: InternalRecommendRequestFormModel ...

  2. ajax提交后台自动反序列化成对象

    下面是ajax提交的方法,主要用到了$form.serializeArray()将表单序列化成json对象,然后用each处理一下,代码如下: var $form = $('<form>& ...

  3. XML 反序列化成对象,绑定到CheckBoxList控件

    1.前台 <div class="control-group"> <label class="control-label"> 导航名称: ...

  4. Json.Net 反序列化成匿名对象

    反序列化一个object var str1 = "{id:1,name:'111',x:[1,2,3],y:{a:'ssss',b:'dddd'}"; var obj1 = Jso ...

  5. c#json将字符串反序列化成对象时不新建类的做法

    在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...

  6. [MVC_Json序列化]Json字符串反序列化成C#对象

    上一篇中有Json序列化相关问题得到了解决. 那么结果集为Json串时,如何将Json串转成C#对象呢? 现举例说明: -现有如下字符串数据 string k = "{\"ring ...

  7. 对象序列化成Json字符串 及 反序列化成对象

    一. public static string JsonSerializer<T>(T t)        {            DataContractJsonSerializer ...

  8. C#将Json字符串反序列化成List对象类集合

    摘自:http://blog.csdn.net/cdefg198/article/details/7520398 using System.IO; using System.Web.Script.Se ...

  9. 使用Newtonsoft.Json序列化和反序列化对象(源码)

    Json数据格式,简单而强大. 使用Json,不得不提到Newtonsoft.Json,它帮助我们更方便的使用Json,当然,不使用它也是可以的,还有许多方法将对象序列化成Json字符串,暂且不提. ...

随机推荐

  1. YII框架概念与安装

    Yii概念: YII安装:      下载最版本http://www.framework.com      解压至访问目录下 直接打开advanced/init.bat文件输入0之后输入yes 打不开 ...

  2. node基础03:使用函数

    1.使用函数 //server.js var http = require("http"); var output = require("./output"); ...

  3. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  4. git by example

    记一次回滚操作 路人甲让我修改一个bug,我在develop下修改了 路人甲让我push到releae/sdk0.7分支上 我本地操作切换到release分支并合并develop上的修改: git c ...

  5. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

  6. ASP.NET 系列:单元测试之Log4Net

    使用Log组件时,我们通常自定义ILogger接口,使用Log4Net等组件进行适配来定义不同的实现类.使用Log4Net日志组件时,为了即方便单元测试又能使用配置文件,我们通过Log4Net的ILo ...

  7. 理解IEnumerator+IEnumerable这种接口思想

    前言 本文不想过多篇幅来介绍IEnumerator和IEnumerable这两个接口的具体说明,只是把它作一个例子作引言而已,本文将根据自己的理解来描述微软为何要这样设计这种关联风格的接口.这种风格的 ...

  8. Webservice学习

    参考博客1: http://www.cnblogs.com/lzhp/archive/2013/01/13/2858559.html 参考博客2:http://blog.csdn.net/shilei ...

  9. Ubuntu下安装支付宝安全控件

    在淘宝购物时,安装支付宝安全控件.下载了一个文件.tar.gz(非常小的一个文件). tar -zxvf 解压之,只有一个aliedit.sh文件,运行这个文件就安装成功了,重启firefox就可以用 ...

  10. shell 实现Linux 控制台下树形显示目录

    #!/bin/bash function main(){      local pre=$1    local name=$2    echo "$pre$name"    tes ...