2012-11-20 49 views
15

我正在关注来自web服务api的json响应。我想从json中提取产品数据。我也想用AFNetworking来实现这一点。AFNetworking和jSON

{"products": [ 
    { 
     "product_id": "1170", 
     "name": "zzzz®", 
     "sort_order": 0, 
     "brand": "zzzas", 
     "product_category_id": "1090", 
     "location_ids": [ 
     "1078" 
     ], 
     "icon_url": "http://zzzzz.com/media/2502/zzzz.png", 
     "icon_date": "Wed, 07 Nov 2012 14:03:47 GMT", 
     "thumbnail_url": "http://zzzz.com/media/2591/zzdfs.png", 
     "thumbnail_date": "Wed, 07 Nov 2012 14:04:02 GMT" 
    }, 
    { 
     "product_id": "1126", 
     "name": "ddddd®", 
     "sort_order": 1, 
     "brand": "dddsas", 
     "product_category_id": "1110", 
     "location_ids": [ 
     "1095" 
     ], 
     "icon_url": "http://zzzzz.com/media/2507/ddddd.png", 
     "icon_date": "Wed, 07 Nov 2012 14:03:48 GMT", 
     "thumbnail_url": "http://zzzzz.com/media/2596/sssds.png", 
     "thumbnail_date": "Wed, 07 Nov 2012 14:04:05 GMT" 
    } 
]} 

任何人都可以提出一个方法来做到这一点.我怎么事情就搞定。

回答

37
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"link"]]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     NSDictionary *jsonDict = (NSDictionary *) JSON; 
     NSArray *products = [jsonDict objectForKey:@"products"]; 
     [products enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop){ 
      NSString *productIconUrl = [obj objectForKey:@"icon_url"]; 
     }]; 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, 
     NSError *error, id JSON) { 
      NSLog(@"Request Failure Because %@",[error userInfo]); 
    } 
]; 

[operation start]; 

试试这个。

更新1:你可以试试这个https://github.com/SSamanta/SSRestClient

更新2:https://github.com/SSamanta/SSHTTPClient(使用SWIFT)

可用的pod:pod 'SSHTTPClient', '~>1.2.2'

+0

非常感谢解析文件的工作也检查了这一点,如果你有一些空闲时间http://stackoverflow.com/questions/13478437/afnetworking-queue-with-pdf-png-mp4-files – Filip

+1

@Filip检查答案在那个链接 –

+0

谢谢圣接受你的答案! – Filip

3

如果你刚开始,我建议使用RestKit来完成这项任务(它使用AFNetworking)。看一个例子here

+6

我想休息套件是我的应用程序 – Filip

+0

RestKit现在似乎相当臃肿太复杂。 – tybro0103

4

要使用AFNetworking分析JSON,只需创建一个子类并在初始化期间添加以下内容。

[self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

然后调用像GET:parameters:completion:的方法将调用与NSDictionary作为response参数(假设JSON是有效的)的完成块。

要下载图片,假设您想要显示图片,请查看UIImageView+AFNetworking

+0

我也想下载一些非常大的pdf文件和一些视频。在那里,我认为我与那些 – Filip

+1

只有registerhttpoperationclass是不足以获得JSON响应数据的问题。完整的步骤是:'[self registerHTTPOperationClass:[AFJSONRequestOperation class]];''和'[self setDefaultHeader:@“Accept”value:@“application/json”]'。指的是[这里](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ#why-dont-i-get-json--xml--property-list-in-my-http-client-回调) – jianpx

+0

@jianpx这取决于您正在与之交谈的服务器以及您是否希望针对您的所有请求使用JSON响应。如果你这样做,那么一定要设置标题。 –

0

首先,为了运行AFNetworking,您首先需要安装“CocoaPods”。这是什么? CocoaPods是Objective-C的依赖管理器,它使安装第三方库 更加快速和安全。它提供了一个Ruby的宝石,你可以安装方式如下:

打开终端,执行以下命令:

sudo gem install cocoapods -V 

要有耐心。该命令可能需要一些时间才能完成,因此“-V”选项将为您提供详细数据。

接下来我们执行:

pod setup 

其中规定了我们的CocoaPods安装。

现在我们必须创建一个PodFile,它将作为我们的CocoaPods配置文件服务器。

回到终端,我们编写以下命令:

touch Podfile 
open -e Podfile 

第一个命令将创建一个名为“Podfile”与Unix的触摸编辑文件。第二行将打开这个新创建的文件进行编辑。 现在,您应该看到一个空的TextEdit窗口打开。现在我们将以下内容粘贴到此文件中:

platform :ios, '7.0' 
pod "AFNetworking", "~> 2.0" 

现在是时候设置我们的Cocoa工作环境了。 重要提示:请确保使用终端上的'cd'命令在您的XCODE PROJECT的当前目录中用您的终端更改您的目录。 例子:

cd /user/xcode/myproject 

一旦你确定你是在正确的目录执行以下终端命令:

pod install 

pod setup 

然后我们通过书面形式安装依赖于我们的项目

现在,这是一个重要的注意事项: 由于您试图安装一个以前不在您当前的X内的项目代码的项目,你必须为你的当前Xcode项目工作区 要为您的Xcode项目创建工作区请执行以下操作(如果你还没有这样做了。):

File > Save Workspace 

一旦你完成后,导航到您的Xcode工作区文件的目录,然后执行以下命令:

open YourProjectName.xcworkspace 

现在你可以使用“导入”在任何文件的开头访问AFNetworking的内置API的功能。

12

如果你使用AFNetworking 3.0,AFJSONRequestOperation不存在了,你必须使用AFHTTPSessionManager

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
[manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 
    NSLog(@"JSON: %@", responseObject); 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}];