RestKit是一个主要用于iOS上网络通信的开源框架,除了发送请求与接受响应这些基本功能外,还附带coredata,以及将远程JSON映射为本地对象的功能。目前版本0.9.3,coredata还不是很稳定,他的coredata的demo页面在4.3.3实机下直接导致程序crash,但是其JSON映射为本地对象的功能是十分强大的。

首先,RestKit要求我们在客户端定义一个Model类,用于存储数据和处理业务逻辑。远程JSON中各键将直接映射为Model中各成员变量。对应每一个模型都要定义一个对应的Model类,这是强制的。

强制定义模型带来的好处是我们只需要写一次字典中的key,不再会因为字典的key拼错导致程序crash了。

RestKit使用起来省时省力,但是思维方式和ASIHTTP差异不小,以下举一例说明。

1、

假设服务器上的JSON数据如下:

{
 
"id": 1234,
 
"name": "Personal Checking",
 
"balance": 5013.26,
 
"transactions": [
 
{"id": 1, "payee": "Joe Blow", "amount": 50.16},
 
{"id": 2, "payee": "Grocery Store", "amount": 200.15},
 
{"id": 3, "payee": "John Doe", "amount": 325.00},
 
{"id": 4, "payee": "Grocery Store", "amount": 25.15}]
 
}

我们用来存储此JSON的对象的类名为SimpleAccount,其中包含六个成员:

_accountID用来对应JSON的id;

_name对应JSON的name;

_balance对应JSON的balance;

_transactionCount对应JSON的transactions数组中元素的数量;

_averageTransactionAmount对应JSON里transactions各元素的amount值的平均数;

_distinctPayees是将JSON里transactions中各元素的payee的值取出来后拼接而成的数组。

首先在Model的.h里定义好我们的数据成员,在.m里写好synthesize:

@interface SimpleAccount : NSObject {
 
NSNumber* _accountID;
 
NSString* _name;
 
NSNumber* _balance;
 
NSNumber* _transactionsCount;
 
NSNumber* _averageTransactionAmount;
 
NSArray*  _distinctPayees;
 
}
 
@property (nonatomic, retain) NSNumber* accountID;
 
@property (nonatomic, retain) NSString* name;
 
@property (nonatomic, retain) NSNumber* balance;
 
@property (nonatomic, retain) NSNumber* transactionsCount;
 
@property (nonatomic, retain) NSNumber* averageTransactionAmount;
 
@property (nonatomic, retain) NSArray*  distinctPayees;
 
@end
 
@implementation SimpleAccount
 
@synthesize accountID = _accountID;
 
@synthesize name = _name;
 
@synthesize balance = _balance;
 
@synthesize transactionsCount = _transactionsCount;
 
@synthesize averageTransactionAmount = _averageTransactionAmount;
 
@synthesize distinctPayees = _distinctPayees;
 
@end

2、

在恰当的时机(比如viewDidAppear中)做JSON键到Model成员变量的映射,然后开始请求数据。

@”id”,@”accountID”,把本Model中的accountID属性映射为JSON的id键对应的值;name和balance属性同理。

@”transactions.@count”,@transactionsCount”,取JSON中transactions数组的元素数。

@”transactions.@avg.amount”,@averageTransactionAmount”,取JSON中transactions的各元素的amount的值的平均数。

@”transactions.@distinctUnionOfObjects.payee”,@”distinctPayees”,将JSON里transactions中各元素的payee的值取出来后拼接而成的数组。

@”transactions.@avg.amount”这种写法比较诡异,可以理解成调用transactions对象的avg方法,传入参数是amount。

代码如下

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[SimpleAccount class]];
 
[mapping mapKeyPathsToAttributes:
 
@"id", @"accountID",
 
@"name", @"name",
 
@"balance", @"balance",
 
@"transactions.@count", @"transactionsCount",
 
@"transactions.@avg.amount", @"averageTransactionAmount",
 
@"transactions.@distinctUnionOfObjects.payee", @"distinctPayees", nil];

3、

定义好映射之后,就可以开始向服务器请求数据了。

[RKObjectManager sharedManager]返回一个单件的RKObjectManager。在初始化时向里面存入服务器的URL;

loadObjectResourcePath指定需要请求的JSON数据在服务器中的相对路径(服务器地址已经储存在RKObjectManage里,所以无需在此指定);

objectClass指定映射成的对象的类;

delegate指定接受回调的对象,在请求完成时,此对象的- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects会被调用。

- (void)workWithKVC {
 
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/accounts.json" objectClass:[SimpleAccount class] delegate:self];
 
}

4、

最后是回调方法,若收到的JSON根为数组,则返回数组。根不是数组,则返回一个count为1的数组,所以回调收到的objects是NSArray*类型的。

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
 
SimpleAccount* account = [objects objectAtIndex:0];
 
// Will output "The count is 4"
 
NSLog(@"The count is %@", [account transactionsCount]);
 
// Will output "The average transaction amount is 150.115"
 
NSLog(@"The average transaction amount is %@", [account averageTransactionAmount]);
 
// Will output "The distinct list of payees is: Joe Blow, Grocery Store, John Doe"
 
NSLog(@"The distinct list of payees is: %@", [[account distinctPayees] componentsJoinedByString:@", "]);
 
}

参考资料http://mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/

以上

–OpenThread

浅谈使用RestKit将服务器的Json直接映射为本地对象的更多相关文章

  1. 浅谈thinkphp中将字符串转换成json数组的方法

    这是一部分代码: $client = M("Client");$data = $client->where('user_id ='.$user_id)->select( ...

  2. 浅谈Perl的类、包、模块与面对对象编程

    http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...

  3. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  4. Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈

    一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...

  5. 浅谈|WEB 服务器 -- Caddy

    浅谈|WEB 服务器 -- Caddy 2018年03月28日 12:38:00 yori_chen 阅读数:1490 标签: caddyserverwebhttps反向代理 更多 个人分类: ser ...

  6. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  7. 浅谈服务器对SEO的影响,该如何选择服务器?

    对于SEO,很多人想的都是怎么做好网站的内部优化,做好外部推广.其实SEO没什么技术含量,到网上搜别人的心得看,千篇一律,都是翻来覆去的说一样的东西,就像吃不同人做的馒头,吃来吃去就是一个味道.笔者经 ...

  8. 浅谈JSON

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没有 ...

  9. 浅谈JSON.stringify 函数与toJosn函数和Json.parse函数

    JSON.stringify 函数 (JavaScript) 语法:JSON.stringify(value [, replacer] [, space]) 将 JavaScript 值转换为 Jav ...

随机推荐

  1. 【JZOJ6434】【luoguP5665】【CSP-S2019】划分

    description analysis 首先有一个结论,对于\([1,i]\)区间划分最后一段的和尽量小,答案会更优,具体证明参考毛爷爷的博客 设\(f[i]\)为满足\([1,i]\)划分最优时. ...

  2. 谷歌浏览器srcoll时,控制台一直报错

    如果是使用betheme-child主题,在wp后台去掉这个srcoll插件 目录是wp后台的Betheme——Theme Options——Addons & Plugins——Addons— ...

  3. 【LeetCode 1】两数之和

    描述 [题解] 用个map的话就是O(N)级别的了. [代码] class Solution { public: unordered_map<int,int> mymap; vector& ...

  4. vc/atlmfc/include/afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT

    环境:win7,64位,vs2012 1> c:/program files/microsoft visual studio 8/vc/atlmfc/include/afx.h(24) : fa ...

  5. python3使用requests和requests_toolbelt上传文件

    https://blog.csdn.net/summerpowerz/article/details/80293235 https://blog.csdn.net/lhh08hasee/article ...

  6. Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议

    目录 目录 前言 Openstack基金委员会 Openstack贡献者须知 注册Openstack In Launchpad 生成并上传OpenPGP密钥 生成并上传SSH公钥 Join The O ...

  7. elasticsearch中TermQuery查不到数据问题

    在java rest client中调用elasticsearch中的数据,精准匹配的termQuery查不到数据,这个问题是java rest client客户端自带的bug,换用matchPhra ...

  8. TLS/SSL 协议 - ClientHello

    ClientHello 在一次新的握手流程中,ClientHello消息总是第一条消息.这条消息将客户端的功能和首选项传送给服务器.客户端会在新建连接后,希望重新协商或者响应服务器发起的重新协商请求( ...

  9. struts基础2

    Result配置详解 说明:在前面的许多案例中我们所用到的Action基本都继承自ActionSupport这个类,而在这个类中我们定义了五个字段:SUCCESS,NONE,ERROR,INPUT,L ...

  10. scala 集合类型

    Iterable 是序列(Seq), 集(Set) 映射(Map)的特质 序列式有序的集合如数组和列表 集合可以通过== 方法确定对每个对象最多包含一个 映射包含了键值映射关系的集合 列表缓存: 使用 ...