ASIHTTP+JSONKit 简单例子

整ASIHTTPRequest和JSONKit花了我近三个晚上(20点到23点30)的时间,今天终于把后台返回的json串解析出来了,为了模拟真实的调用环境,用spring mvc搭了个简单的java后台服务。提供json数据

运行如下

同步调用、异步调用、块格式调用 说的是用ASIHTTPRequest请求后台的方式。下面有一个按钮是批JSON解析
其实ASIHTTPRequest请求后台都没什么好说的,官方的API说的很清楚,可以看看官方的 how to use
时间主要都花在解析后台返回的数据上了。
下面上代码
controller.h文件
  1. #import <UIKit/UIKit.h>
  2. #import "ASIHTTPRequest.h"
  3. #import "JSONKit.h"

  4. @interface ITViewController : UIViewController
  5. @property (strong,nonatomic) IBOutlet UILabel *label;
  6. //同步调用
  7. - (IBAction)buttonpressed:(id)sender;
  8. //异步调用
  9. - (IBAction)asyButtonpressed:(id)sender;
  10. //块格式调用
  11. - (IBAction)blockButtonpressed:(id)sender;
  12. //JSONKit测试
  13. - (IBAction)jsonKitTestButtonpressed:(id)sender;
  14. //JSONKit本地测试
  15. -(IBAction)localJsonKitTest:(id)sender;
  16. //JSONKit返回集合数据(集合中都是原始字段的数据)
  17. - (IBAction)jsonKitArrayListWithYY:(id)sender;
  18. @end
复制代码
ASIHTTPRequest的使用就不写了,官方都有
下面看看调用后台的吧 ,
先贴一下,java端返回的数据:
[
{
"name": "北京",
"id": 1,
"routes": [
{
"id": 1,
"content": "北京一日游,好玩",
"days": 1,
"title": "北京一日游",
"startDate": 1348070400000,
"endDate": 1345392000000,
"scenerySpot": "天安门、长城",
"price": 168,
"districtId": 1,
"bigImgId": 1,
"samllImgId": 1,
"specialPrice": 1,
"routeDate": null,
"clickCount": null,
"isRecommend": null
},
{
"id": 2,
"content": "北京长城 十三陵一日游",
"title": "北京长城 十三陵一日游",
"startDate": 1345478400000,
"endDate": 1345478400000,
"scenerySpot": "长城 十三陵",
"price": 190,
"isRecommend": null
}
]
},
{
"name": "上海",
"id": 2,
"routes": []
},
{
"name": "湖南",
"id": 3,
{
"name": "湖北",
"id": 4,
{
"name": "浙江",
"id": 5,
{
"name": "江苏",
"id": 6,
{
"name": "福建",
"id": 7,
{
"name": "新疆",
"id": 8,
"routes": []
}
]

这个方法是JSONKit远程测试的
  1. - (IBAction)jsonKitTestButtonpressed:(id)sender{

  2. //本地测试json转对象
  3. // Nsstring *strjson = @"{\"aps\": {\"alert\":{\"body\":\"a msg come!\"},\"bage\":3,\"sound\":\"def.mp3\"}}";
  4. // NSDictionary *result = [strjson objectFromJSONString];
  5. // NSLog(@"%@",result);
  6. //本地测试对象转json
  7. //生成json数据
  8. // NSMutableDictionary *jsonDic = [NSMutableDictionary dictionary];
  9. // NSMutableDictionary *alert = [NSMutableDictionary dictionary];
  10. // NSMutableDictionary *aps = [NSMutableDictionary dictionary];
  11. // [alert setobject:@"a msg come!" forKey:@"body"];
  12. // [aps setobject:alert forKey:@"alert"];
  13. // [aps setobject:@"3" forKey:@"bage" ];
  14. // [aps setobject:@"def.mp3" forKey:@"sound"];
  15. // [jsonDic setobject:aps forKey:@"aps"];
  16. // Nsstring *strjson = [jsonDic JSONString];
  17. rjson);
  18. //远程测试读取java服务中返回的json
  19. //构造一个url http://192.168.0.92:8080/ly/w/route/ios_test
  20. //http://192.168.0.92:8080/ly/w/route/findRouteByCategoryId?categoryId=1
  21. NSURL *url = [NSURL URLWithString:@"http://192.168.0.92:8080/ly/w/route/findRouteByCategoryId?categoryId=1"];
  22. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  23. [request startSynchronous];
  24. NSError *error = [request error];
  25. if (!error) {
  26. Nsstring *response = [request responseString];

  27. NSLog(@"请求的结果是;%@",response);
  28. label.text = @"succeeded";
  29. //用[obj class]查看后发现返回的数据是JKArray
  30. NSArray *result = [response objectFromJSONString];
  31. NSLog(@"%@",[result class]);
  32. for (int i = 0; i < [result count]; i++) {
  33. //取得result的每一条记录
  34. NSDictionary *di1 = [result objectAtIndex:i];
  35. Nsstring *t_id = [di1 objectForKey:@"id"];
  36. Nsstring *t_name = [di1 objectForKey:@"name"];
  37. NSLog(@"第%d条记录的id值是%@",i+1,t_id);
  38. NSLog(@"第%d条记录的name值是%@",t_name);

  39. //取得每个城市下的线路routes
  40. NSArray *routes = [di1 objectForKey:@"routes"];
  41. //循环线路
  42. for (NSDictionary *route in routes) {
  43. //取得每个线路下的标题
  44. Nsstring *title = [route objectForKey:@"title"];
  45. NSLog(@"%@",title);
  46. }
  47. }
  48. }
先用NSUrl构造一个url,然后用ASIHTTPRequest请求,如果没错误的情况下用Nsstring来接收返回的值
  1. Nsstring *response = [request responseString];
调用JSONKit转成NSArray
  1. [response objectFromJSONString];
时间就是花在这了,当时不知道这个地方到底该用什么接收,网上查都说是用NSDictionary,但是用这个就一直报错,后面听群里的网友说,可以用 [obj class] 来确定是什么类型,试了下,果真好使,,,,到这基本上就没什么问题了 ,哈哈。
当用[obj class]得知返回的数据是Array之后,就直接用NSArray接收就好了,后面什么都通顺了。。。
点击JSONKit远程测试,控制台输出
2012-9-13 23:32:28 上传
下载附件(97.16 KB)
记录一下,当时纠结的心情只有自己知道。
路漫漫其修远兮,吾将上下而求索。

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...