2012-11-20 84 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); 
}];