AFNetworking和JSON

16

我正在从 Web 服务 API 中获取以下 JSON 响应。我想从 JSON 中提取产品数据。我还想使用 AFNetworking 实现此操作。

 {"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"
    }
]}

有人可以建议一种方法来做这个告诉我事情将如何完成。

7个回答

36
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'


非常感谢,这对于解析文件非常有效。如果你有空的话,也可以看看这个链接:http://stackoverflow.com/questions/13478437/afnetworking-queue-with-pdf-png-mp4-files - fizampou
1
@Filip,请检查该链接中的答案。 - Susim Samanta

13
如果您正在使用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);
}];

4
为了使用AFNetworking解析JSON,只需创建一个子类,并在初始化期间添加以下内容。
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

调用像 GET:parameters:completion: 这样的方法将以一个 NSDictionary 作为 response 参数(假设 JSON 是有效的)来调用完成块。

如果您想下载图像并显示它们,请查看UIImageView+AFNetworking


我也想下载一些非常大的PDF文件和视频。我认为在这方面我遇到了一些问题。 - fizampou
1
仅仅注册registerHTTPOperationClass是不足以获取JSON响应数据的。完整的步骤是:[self registerHTTPOperationClass:[AFJSONRequestOperation class]];[self setDefaultHeader:@"Accept" value:@"application/json"]。请参考这里 - jianpx
@jianpx 这取决于你所连接的服务器以及是否希望所有请求都返回JSON响应。如果是这样,那么一定要设置头文件。 - Michael Mior

3

如果您刚开始学习,我建议您使用RestKit来完成此任务(它使用AFNetworking)。在这里可以看到一个示例


6
我认为 RestKit 对我的应用来说过于复杂。 - fizampou
RestKit现在看起来相当臃肿。 - tybro0103

1

0
首先,为了运行AFNetworking,您需要先安装“CocoaPods”。这是什么?
CocoaPods是一个依赖管理器,用于Objective-C,它使得安装第三方库如AFNetworking更快、更安全。它作为Ruby Gem提供,您可以按照以下方式进行安装:
打开终端并执行以下命令:
sudo gem install cocoapods -V

请耐心等待。该命令可能需要一些时间才能完成,因此“-V”选项将为您提供详细的数据以了解正在发生的情况。

接下来我们执行:

pod setup

这将设置我们的CocoaPods安装。

现在我们需要创建一个PodFile,它将作为我们的CocoaPods配置文件。

回到终端,我们输入以下命令:

touch Podfile
open -e Podfile

第一条命令将使用Unix touch编辑器创建名为“Podfile”的文件。第二行将打开这个新创建的文件以进行编辑。 现在,您应该看到一个空的TextEdit窗口已经打开。现在我们将以下内容粘贴到此文件中:
platform :ios, '7.0'
pod "AFNetworking", "~> 2.0"

现在是设置我们的Cocoa工作环境的时候了。 重要提示:请确保使用终端中的“cd”命令将您的目录更改为XCODE项目的当前目录。 例如:
cd /user/xcode/myproject

一旦您确定您在正确的目录下,请执行以下终端命令:

pod setup

然后,我们通过编写以下命令来安装项目的依赖项:

pod install

现在,这是一个重要的提示: 由于您正在尝试安装一个以前不在当前Xcode项目中的项目,您必须为当前Xcode项目创建一个工作区(如果您还没有这样做的话)。 要为您的Xcode项目创建一个工作区,请执行以下操作:

File > Save Workspace

完成后,导航到您的Xcode工作区文件所在的目录,并执行以下命令:

open YourProjectName.xcworkspace

现在,您只需在任何文件的开头使用“import”即可访问AFNetworking的内置API功能。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接