2014年12月23日 星期二

[Objective-C] 利用NSData dataWithContentsOfURL取得JSON文件

JSON是一種輕量級的資料交換格式,我們時常會需要從網路下載並解析JSON文件有許多方式可以完成此目標,在此說明其中一種。

網路上有許多JSON文件可以免費利用,這個範例是使用台北市政府資料開放平台提供JSON。

臺北市健康服務中心
資料集描述:各區健康服務中心
主要欄位說明:健康服務中心名稱、網址、行政區、地址、電話

假設我們要取出名稱及地址,顯示在TableView之中。

宣告一個靜態字串變數,內容為JSON文件內容的網址,以利未來使用。
static NSString * const KJSON = @"http://data.taipei.gov.tw/opendata/apply/json/RkRDNjk0QzUtNzdGRC00ODFCLUJBNDktNEJCMUVCMDc3ODFE";

在TableView之中,加入一個Bar Button Item並設定一個Action名稱為getJsonAction











- (IBAction)getJsonAction:(UIBarButtonItem *)sender {}

在設定一個全域型的NSMutableArray來儲存JSON
NSMutableArray *jsondata;
當我們按下此按鈕後,就下載JSON文件並顯示於TableView之中
NSURL *url = [NSURL URLWithString:KJSON];
//設定URL路徑
NSError *error;
//創建錯誤訊息物件
使用NSData中的類別方法
+ (instancetype)dataWithContentsOfURL:(NSURL *)aURL options:(NSDataReadingOptions)mask error:(NSError **)errorPtr
此方法是同步傳輸,如果網路狀態很差的話,會給使用者很差的體驗,因為會卡住整個程式很久。

參數說明
dataWithContentsOfURL: 丟入一個NSURL

options:設定NSDataReadingOptions,有三種狀態可以選
NSDataReadingMappedIfSafe 會儲存到虛擬記憶體中,如果安全且可行 
NSDataReadingUncached 只會讀取,不會儲存到記憶體中,較快速
NSDataReadingMappedAlways 不管安不安全,只要能存,就存到記憶體中
error:錯誤訊息
NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];
//我們丟入URL,狀態選擇只讀不存 在加入判斷式,確定無誤在存入jsondata之中
利用NSJSONSerialization的類別方法
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
參數說明
data:丟入要轉換的data物件
options:NSJSONReadingOptions
NSJSONReadingMutableContainers 回傳的JSON之中的Dictionary或Array,都是可變(mutable)的
NSJSONReadingMutableLeaves 回傳的JSON之中的子節點若是String,則會回傳可變(mutable)的
NSJSONReadingAllowFragmentsJSON 頂層元素如果不是Array或Dictionary,也能解析此JSON
最後在把TableView的DataSource設定即可
執行結果



沒有留言:

張貼留言