Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 雅虎股票符号建议查找不是json格式!无法解析_Objective C_Json_Yahoo_Finance_Stock - Fatal编程技术网

Objective c 雅虎股票符号建议查找不是json格式!无法解析

Objective c 雅虎股票符号建议查找不是json格式!无法解析,objective-c,json,yahoo,finance,stock,Objective C,Json,Yahoo,Finance,Stock,我的目的是制作一个应用程序(iOS),用户可以输入任意字母组合,雅虎将推荐几只与该搜索匹配的股票 我的问题实际上与一个老问题有关,这里: 回答是这样的: 你得到这个: YAHOO.Finance.SymbolSuggest.ssCallback({“ResultSet”:{“Query”:“k”,“Result”:[{“symbol”:“k”,“name”:“Kellogg 公司“,”exch“:”NYQ“,”类型“:”S“,”exchDisp“:”NYSE“,”类型DISP“:”Equit

我的目的是制作一个应用程序(iOS),用户可以输入任意字母组合,雅虎将推荐几只与该搜索匹配的股票

我的问题实际上与一个老问题有关,这里:

回答是这样的:

你得到这个:

YAHOO.Finance.SymbolSuggest.ssCallback({“ResultSet”:{“Query”:“k”,“Result”:[{“symbol”:“k”,“name”:“Kellogg 公司“,”exch“:”NYQ“,”类型“:”S“,”exchDisp“:”NYSE“,”类型DISP“:”Equity“},{”符号“:”KO“,”名称“:”公司 可口可乐 公司,exch:“NYQ”,“类型”:“S”,“exchDisp:“NYSE”,“typeDisp:“EQUOTE”},{“symbol:“KRA”,“名称”:“Kraton” 高性能聚合物 公司“,“exch”:“NYQ”,“类型”:“S”,“exchDisp”:“NYSE”,“typeDisp”:“Equity”},{“symbol”:“KMI”,“名称”:“Kinder” 摩根, 公司“,“exch”:“NYQ”,“类型”:“S”,“exchDisp”:“NYSE”,“typeDisp”:“Equity”},{“symbol”:“KEY”,“name”:“KeyCorp.”,“exch”:“NYQ”,“type”:“S”,“exchDisp”:“NYSE”,“typeDisp”:“Equity”},{“symbol”:“KMB”,“name”:“Kimberly Clark 公司,exch:“NYQ”,“类型”:“S”,“exchDisp:“NYSE”,“typeDisp:“Equity”},{“symbol:“KRFT”,“名称”:“Kraft” 食品集团, 公司“,“exch”:“NMS”,“类型”:“S”,“exchDisp”:“NASDAQ”,“typeDisp”:“EQUOTE”},{“symbol”:“KORS”,“名称”:“Michael” Kors控股公司 有限公司、exch:“NYQ”、“类型”:“S”、“exchDisp:“NYSE”、“typeDisp:“Equity”}、{“symbol:“GMCR”、“名称”:“Keurig” 青山, 公司“,”exch“:”NMS“,”类型“:”S“,”exchDisp“:”纳斯达克“,”类型DISP“:”股权“},{”符号“:”KLAC“,”名称“:”KLA Tencor 公司、exch:“NMS”、“类型”:“S”、“exchDisp:“纳斯达克”、“类型DISP:“股权”}]})

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

YAHOO.Finance.SymbolSuggest.ssCallback(

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

NSDictionary *root = [NSJSONSerialization JSONObjectWithData: data
options:NSJSONReadingAllowFragments error: &parsingError];
NSLog(@"root: %@", root);
根是空的。在一个普通的json对象中,我使用选项:kNilOptions,但在尝试google解决方案后更改了

错误消息如下:

Error Domain=NSCOCAERRORDOMAIN Code=3840“操作无法完成。(可可错误3840)。“(字符0周围的值无效。)UserInfo=0x7ff5637375f0{NSDEBUGSCRIPTION=字符0周围的值无效。}

我该怎么办?请直截了当。我真的很喜欢谷歌,但我不明白。谢谢

我的全部代码是:

- (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];

}

看起来Yahoo正在推出JSONP(带填充的JSON)。不幸的是,解决方案看起来像“从括号中的任何内容中提取一个子字符串并解析它。”


看起来Yahoo推出了JSONP(带填充的JSON)。不幸的是,解决方案看起来像是“从括号内的任何内容中提取一个子字符串并解析它。”


答案是这是一个带填充的jsonp;json,我需要解析掉多余的文本,使其符合json。多亏了Rikkibibson,解决方案如下:

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];

}

答案是这是一个带填充的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];

}

谢谢Rikki!我用你的链接解决了问题。不过我没有代表投票支持它。谢谢Rikki!我用你的链接解决了问题。不过我没有代表投票支持它。