雅虎股票代码建议查找不是json格式!无法解析

时间:2015-07-08 01:08:51

标签: objective-c json yahoo finance stock

我的目的是创建一个应用程序(iOS),用户可以在其中输入任何字母组合,雅虎将建议几个与壁橱相匹配的股票以匹配该搜索。

我的问题实际上与较旧的问题有关,在这里: Stock ticker symbol lookup API

通过这样做回答: http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=k&callback=YAHOO.Finance.SymbolSuggest.ssCallback

你明白了:

  

YAHOO.Finance.SymbolSuggest.ssCallback({ “结果集”:{ “查询”: “K”, “结果”:[{ “符号”: “K”, “名称”:“凯洛格   公司 “ ”可置换“: ”NYQ“, ”类型“: ”S“, ”exchDisp“: ”NYSE“, ”typeDisp“: ”公平“},{ ”符号“: ”KO“, ”名“:”该   可口可乐   公司 “ ”可置换“: ”NYQ“, ”类型“: ”S“, ”exchDisp“: ”NYSE“, ”typeDisp“: ”公平“},{ ”符号“: ”KRA“, ”名“:”科腾   高性能聚合物   公司 “” EXCH “:” NYQ”, “类型”: “S”, “exchDisp”: “纽约”, “typeDisp”: “公平”},{ “符号”: “KMI”, “姓名”: “金德   摩根,   公司 “” EXCH “:” NYQ”, “类型”: “S”, “exchDisp”: “纽约”, “typeDisp”: “公平”},{ “符号”: “KEY”, “姓名”: “KeyCorp公司”, “EXCH”: “NYQ”, “类型”: “S”, “exchDisp”: “纽约”, “typeDisp”: “公平”},{ “符号”: “KMB”, “姓名” :“金佰利   公司 “ ”可置换“: ”NYQ“, ”类型“: ”S“, ”exchDisp“: ”NYSE“, ”typeDisp“: ”公平“},{ ”符号“: ”KRFT“, ”名“:”卡夫   食品集团   公司 “” EXCH “:” NMS”, “类型”: “S”, “exchDisp”: “NASDAQ”, “typeDisp”: “公平”},{ “符号”: “KORS”, “姓名”: “迈克尔·   Kors Holdings   有限公司 “ ”可置换“: ”NYQ“, ”类型“: ”S“, ”exchDisp“: ”NYSE“, ”typeDisp“: ”公平“},{ ”符号“: ”GMCR“, ”名“:”克里格   绿山,   公司 “” EXCH “:” NMS”, “类型”: “S”, “exchDisp”: “NASDAQ”, “typeDisp”: “公平”},{ “符号”: “KLAC”, “姓名”: “KLA-Tencor公司   团”, “EXCH”: “NMS”, “类型”: “S”, “exchDisp”: “NASDAQ”, “typeDisp”: “公平”}]}})

但这不是有效的JSON格式。返回数据的第一部分是:

  

YAHOO.Finance.SymbolSuggest.ssCallback(

我不知道该怎么做。当我这样做时:

NSDictionary *root = [NSJSONSerialization JSONObjectWithData: data
options:NSJSONReadingAllowFragments error: &parsingError];
NSLog(@"root: %@", root);

root为null。在普通的json对象中,我使用了选项:kNilOptions但在尝试谷歌解决方案后发生了变化。

错误信息是:

  

错误域= NSCocoaErrorDomain代码= 3840“操作无法完成。(Cocoa错误3840。)”(字符0周围的值无效。)UserInfo = 0x7ff5637375f0 {NSDebugDescription =字符0周围的值无效。}

我该怎么办?请明确。我真的像疯了一样用Google搜索,但我不明白。谢谢!

我的完整代码是:

- (void)createSearchObj: (NSString*)searchStr {

NSString *searchString = [NSString stringWithFormat: @"http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=%@&callback=YAHOO.Finance.SymbolSuggest.ssCallback", searchStr];

NSLog(@"searchString: %@", searchString);

NSURL                *url     = [NSURL URLWithString:searchString];
NSURLRequest         *request = [NSURLRequest requestWithURL:url];
NSURLSession         *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task    = [session dataTaskWithRequest:request completionHandler:^
                                 (NSData *data, NSURLResponse *response, NSError *error)
                                 {
                                     NSLog(@"ERROR: %@", error);
                                     NSLog(@"DATA: %@", data);

                                     NSError *parsingError = error;
 /*
                                     NSDictionary *root =
                                     [NSJSONSerialization JSONObjectWithData:
                                      data options:kNilOptions error: &parsingError];
*/
                                     NSDictionary *root =
                                     [NSJSONSerialization JSONObjectWithData:
                                      data options:NSJSONReadingAllowFragments error: &parsingError];

                                     NSLog(@"root: %@", root);

                                     if (!parsingError) {

                                        dispatch_async(dispatch_get_main_queue(), ^{

                                            NSDictionary *dict = [root objectForKey:@"ResultSet"];
                                            NSLog(@"dict: %@", dict);

                                        });

                                     } else {

                                         NSLog(@"Could not parse json: %@", parsingError);

                                     }

                                 }];

[task resume];
[self.view endEditing:YES];

}

2 个答案:

答案 0 :(得分:0)

看起来雅虎推出了JSONP(带填充的JSON)。可悲的是,解决方案看起来似乎是"取括号中的任何内容并解析它。"

How to parse JSONP in Objective-C?

答案 1 :(得分:0)

答案是这是一个jsonp;带填充的json,我需要解析额外的文本以使其符合json。感谢rikkigibson,解决方案是:

if (data) {
          NSLog(@"data");
          NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
          NSLog(@"jsonString: %@", jsonString);

          NSRange range = [jsonString rangeOfString:@"("];
          range.location++;
          range.length = [jsonString length] - range.location - 1; // removes parens and trailing semicolon
          NSString *jsonString = [jsonString substringWithRange:range];
          NSLog(@"jsonString after cut: %@", jsonString);
          NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

          NSError *jsonError = nil;
          NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
          NSLog(@"jsonResponse: %@", jsonResponse);

       if (jsonResponse) {
       // process jsonResponse as needed
       } else {
       NSLog(@"Unable to parse JSON data: %@", jsonError);
       }
       } else {
       NSLog(@"Error loading data: %@", error);
       }
       if (!parsingError) { dispatch_async(dispatch_get_main_queue(), ^{
       // Do stuff here
       });

       } else {

       NSLog(@"Could not parse json: %@", parsingError);

       }

       }];

[task resume];
[self.view endEditing:YES];

}