忙完了一堆事终于可以安心写写一直想写的ios开发了,但是这两天进度缓慢,各种不顺,花了两天时间终于搞定了在ios应用中使用AFNetworking开源第三方库来远程获取服务器端的json数据并且解析保存在内存中。
首先要配置cocoapods用于管理第三方库
首先更新ruby
sudo gem update –system
之后利用ruby包管理下载cocoapods’
sudo gem install cocoapods
(pod setup)
在需要用到第三方管理的工程根目录下
touch Podfile
open –e Podfile (vim Podfile)
在Podfile 中填入的信息
platform :ios, ‘5.0’
pod ‘AFNetworking’, ‘0.9.1’
然后pod install 一下就搞定了
貌似pod install的时候原来的xcodeproj还不能关,不然xcworkspace打开就跑不了额
但是不知道为什么版本升到1.0之后就没法正确编译了 在AFNetworking的源码中会出现parse issue的离奇错误
配置好之后 进入工程的根路径 打开.xcworkspace的文件进入xcode
可以发现已经在pod中配置好了AFNetworking第三方库
新建UIViewController 然后在控件的回调方法中添加如下代码
相对于远程服务器端的jsp中输出的
<%response.setContentType("text/json");out.println("{\"name\":\"clea\", \"age\":21}");%>
对应的oc解析代码为
- (IBAction)buttonAction:(id)sender{ NSURL* url = [NSURL URLWithString:@"http://threethree.cloudfoundry.com/jsonreply.jsp"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"App.net Global Stream: %@", JSON); NSDictionary* jsonDict = (NSDictionary*) JSON; NSString* name = [jsonDict objectForKey:@"name"]; int age = [[jsonDict objectForKey:@"age"] intValue]; NSLog(@"name: %@", name); NSLog(@"age: %d", age); } failure:^(NSURLRequest* request, NSHTTPURLResponse* response, NSError* error, id JSON){ NSLog(@"failure!!!"); NSLog(@"fail: %@", [error localizedDescription]); }]; [operation start];}
就只是将json对象当做字典对象解析键值对即可。
对于服务器端jsp文件的输出
<%response.setContentType("text/json");out.println("[{\"name\":\"clea\", \"age\":21}, {\"name\":\"kiwi\", \"age\":21}]");%>
对应的oc解析代码为
- (IBAction)arrayButtonAction:(id)sender{ NSURL* url = [NSURL URLWithString:@"http://threethree.cloudfoundry.com/jsonreplyarray.jsp"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; AFJSONRequestOperation* afjsonRequestOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest* request, NSHTTPURLResponse* response, id JSON){ NSArray* jsonArray = (NSArray*)JSON; for(NSDictionary* jsonDict in jsonArray){ NSString* name = [jsonDict objectForKey:@"name"]; int age = [[jsonDict objectForKey:@"age"] intValue]; NSLog(@"name : %@\n", name); NSLog(@"age : %d\n", age); } } failure:^(NSURLRequest* request, NSHTTPURLResponse* response, NSError* error, id JSON){ NSLog(@"error is : %@", [error localizedDescription]); }]; [afjsonRequestOperation start];}
和之前的不同就是要先将json对象当做数组对象再逐个解析
要注意的是在服务器端一定要将响应的类型设置为text/json
在客户端使用AFNetworking的类中要包含头文件
#import "AFJSONRequestOperation.h"
最后就可以再command line中看到输出的结果了
本次测试使用的是 mac os x 10.7.2 xcode 4.2.1