2014-03-02 185 views
0

我在學習如何在Objective-C中使用API​​。我正在使用這裏的數據:https://btc-e.com/api/2/ltc_usd/ticker,我只想要'最後'的值。我試圖提取這樣的值:從json字符串中提取值

NSURL * url=[NSURL URLWithString:@"https://btc-e.com/api/2/ltc_usd/ticker"]; 
NSData * data=[NSData dataWithContentsOfURL:url]; 
NSError * error; 

NSMutableDictionary * json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error]; 
NSArray *keys = [json allKeys]; 
NSString *jsonStr = [json objectForKey:keys[0]]; 

NSArray *c1 = [jsonStr componentsSeparatedByString:@"last = \""]; 
NSArray *c2 = [[c1 objectAtIndex:1] componentsSeparatedByString:@"\";"]; 
NSString *result = [c2 objectAtIndex:0]; 

NSLog(@"%@", result); 

然而,這給了我以下錯誤:

2014-03-02 15:03:24.915 Litecoin Ticker[5727:303] -[__NSDictionaryM componentsSeparatedByString:]: unrecognized selector sent to instance 0x608000240690 
2014-03-02 15:03:24.915 Litecoin Ticker[5727:303] -[__NSDictionaryM componentsSeparatedByString:]: unrecognized selector sent to instance 0x608000240690 

我不能完全肯定這僅僅是提取API的價值觀的方式,但我似乎無法找到如何去做。誰能幫忙?

+0

轉到json.org並瞭解JSON語法。它需要5-10分鐘,並知道它使一切更容易理解。 –

+0

並且不需要使用'componentsSeparatedByString'。只需使用'objectForKey'來引用NSDictionarys(或者使用'[]']來引用新的表單)。 ''NSNumber * last = json [@「ticker」] [@「last」];' –

+0

(而且,特別是從Web上取下數據時,請始終檢查NSJSONSerialization的值,如果爲零,至少NSLog出錯'值。) –

回答

1
NSString *jsonStr = [json objectForKey:keys[0]]; 
^^^^^^^^^^^^^^^^^ 
// nope, it's a NSDictionary... 

...它已被解析!

如果你NSLog它你會看到它的內容。這裏是你必須NSJSONSerialization解析的JSON後,你如何訪問last領域:

NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error]; 
NSNumber *last = json[@"ticker"][@"last"]; 

就是這樣。


作爲一個側面說明

NSData * data = [NSData dataWithContentsOfURL:url]; 

是可怕的,因爲它是同步的!考慮使用異步方法(核 - 也許最好 - 選項是使用AFNetworking)。下面是一個完整的AFNetworking示例:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager GET:@"https://btc-e.com/api/2/ltc_usd/ticker" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) { 
    NSNumber *last = JSON[@"ticker"][@"last"]; 
    NSLog(@"last value: %@", last); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

哇,我不敢相信我太過於複雜! AFNetworking部分是做什麼的? – user2397282

+0

這是一個網絡框架。它基本上將Objective-C網絡API包裝到更好的基於塊的網絡API中。 –

+0

@ user2397282 w.r.t.你的具體情況是它使得調用是異步的,所以它不會阻塞你正在執行的線程(如果它是主線程,你將阻止UI,直到請求被執行!) –