2016-11-29 67 views
-1

是否有人可以幫我分析以下jsonData成的NSDictionary對象無法從金融谷歌解析JSON數據

[{ 「ID」: 「22144」, 「T」: 「AAPL」,」 e「:」NASDAQ「,」l「:」111.57「 ,」l_fix「:」111.57「,」l_cur「:」111.57「,」s「:」2「,」ltt「 「lt」:「11月28日下午4點」,「lt_dts」 ,「cp」:「-0.20」,「cp_fix」:「-0.20」,「ccol」 :「chr」,「pcls_fix」:「111.79」,「el」:「111.56」,「el_fix」:「111.56 「 ,」el_cur「:」111.56「,」elt「:」11月28日,美國東部時間晚上8點「,」ec「:」-0.01「 ,」ec_ 「-0.01」,「ecp」:「-0.01」,「ecp_fix」:「-0.01」,「eccol」: 「chr」,「div」:「0.57」,「yld」:「2.04」 }]

#define QUERY_PREFIX @"https://www.google.com/finance/info?q=NSE:AAPL" 
#define QUERY_SUFFIX @"NSE:AAPL" 

@implementation YQL 

- (NSDictionary *) query: (NSString *)statement { 


    NSString *query = [NSString stringWithFormat:@"%@%@%@", QUERY_PREFIX, [statement stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding], QUERY_SUFFIX]; 
    NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding]; 

    NSString *dataString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSUInteger firstCurlyBracePos = [dataString rangeOfString:@"[" options:0].location; 
    NSUInteger lastCurlyBracePos = [dataString rangeOfString:@"]" options: NSBackwardsSearch].location; 
    NSString *jsonString = nil; 
    if(firstCurlyBracePos != NSNotFound && lastCurlyBracePos != NSNotFound) { 
     jsonString = [dataString substringWithRange:NSMakeRange(firstCurlyBracePos, (lastCurlyBracePos-firstCurlyBracePos)+1)]; 
    } 

    NSData *someData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSLog(@"%@ Nirmal",jsonString); 
    NSError *error = nil; 
    NSDictionary *results = [NSJSONSerialization JSONObjectWithData:someData options:0 error:&error]; 

    NSLog(@"%@ Anand",results); 
    NSString* latestLoans = [results objectForKey:@"el_cur"]; 

    NSLog(@"loans: %@", latestLoans); 


    if (error) NSLog(@"[%@ %@] JSON error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription); 

    return results; 
} 

@end 

終止應用程序由於未捕獲的異常 'NSInvalidArgumentException' 的,原因是: ' - [__ NSSingleObjectArrayI objectForKey:]:無法識別的選擇發送到實例0x61800000d010'

+0

這是一個有效的json。你正在使用'NSJSONSerialization'。但是因爲第一個對象是數組,所以使用帕特里克的建議。 – rptwsthi

+0

爲什麼你將'JSON'' NSData'轉換爲字符串,然後將字符串轉換回'NSData'?在我看來,你試圖使用字符串解析來擺脫外部數組。不要這樣做。只需將整個東西轉換爲JSON對象並解析即可。並且是否將評論雙斜槓(「//」)作爲您獲得的數據的一部分,或者您是否添加了這些內容? –

回答

1

的JSON你試圖解析的是一個數組,而不是一個對象,如方括號所示。所以NSJSONSerialization將在這裏返回一個NSArray,而不是NSDictionary。由於看起來像這個數組中只有一個對象,所以可以這樣訪問它:

NSArray *results = [NSJSONSerialization JSONObjectWithData:someData options:0 error:&error]; 

NSDictionary *object = results.firstObject; 

NSString *latestLoans = object["el_cur"];