我的目的是创建一个应用程序(iOS),用户可以在其中输入任何字母组合,雅虎将建议几个与壁橱相匹配的股票以匹配该搜索。
我的问题实际上与较旧的问题有关,在这里: Stock ticker symbol lookup API
你明白了:
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];
}
答案 0 :(得分:0)
看起来雅虎推出了JSONP(带填充的JSON)。可悲的是,解决方案看起来似乎是"取括号中的任何内容并解析它。"
答案 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];
}