Символ акций Yahoo предполагает, что поиск не в формате json! Не в состоянии распознать

Моя цель — сделать приложение (iOS), в котором пользователь может ввести любую комбинацию букв, а Yahoo предложит несколько акций, наиболее подходящих для этого поиска.

Мой вопрос на самом деле связан с более старым вопросом, здесь: API поиска биржевого тикера< /а>

И ответил, выполнив следующее: http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=k&callback=YAHOO.Finance.SymbolSuggest.ssCallback

Вы получаете это:

YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"k","Result":[{"symbol":"K","name":"Kellogg Company","exch":" NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Капитал"},{"символ":"KO","name":"Компания Coca-Cola"," exch":"NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Капитал"},{"символ":"KRA","name":"Kraton Performance Polymers Inc. .","exch":"NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Капитал"},{"symbol":"KMI","name":" Kinder Morgan, Inc.","exch":"NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Капитал"},{"symbol":"KEY"," name":"KeyCorp.","exch":"NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Equity"},{"symbol":"KMB", "name":"Kimberly-Clark Corporation","exch":"NYQ","type":"S","exchDisp":"NYSE","typeDisp":"Капитал"},{"symbol":" KRFT","name":"Kraft Foods Group, Inc.","exch":"NMS","type":"S","exchDisp":"NASDAQ","typeDisp":"Капитал"},{ «symbol»: «KORS», «name»: «Michael Kors Holdings Limited», «exch»: «NYQ», «type»: «S», «exchDisp»: «NYSE», «typeDisp»: «Капитал» },{"символ":"GMCR ","name":"Keurig Green Mountain, Inc.","exch":"NMS","type":"S","exchDisp":"NASDAQ","typeDisp":"Капитал"},{" символ":"KLAC","название":"KLA-Tencor Corporation","обмен":"NMS","тип":"S","exchDisp":"NASDAQ","typeDisp":"Капитал"} ]}})

Но это недопустимый формат JSON. Первая часть возвращаемых данных:

YAHOO.Finance.SymbolSuggest.ssCallback(

И я не знаю, что с этим делать. Когда я делаю это:

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

Корень нулевой. В обычном объекте json я использую options:kNilOptions, но изменился после попытки найти решения Google.

Сообщение об ошибке следующее:

Error Domain = NSCocoaErrorDomain Code = 3840 «Операция не может быть завершена. (Ошибка Cocoa 3840.)» (Недопустимое значение вокруг символа 0.) UserInfo = 0x7ff5637375f0 {NSDebugDescription = Недопустимое значение вокруг символа 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];

}

person Tilo Delau    schedule 08.07.2015    source источник


Ответы (2)


Похоже, Yahoo выпускает JSONP (JSON с дополнением). К сожалению, решения выглядят так: «взять подстроку того, что находится внутри круглых скобок, и проанализировать ее».

Как анализировать JSONP в Objective-C?

person Rikki Gibson    schedule 08.07.2015
comment
Спасибо Рикки! Мне удалось разобраться с вашей ссылкой. Однако у меня нет представителя, чтобы проголосовать за это. - person Tilo Delau; 08.07.2015

Ответ в том, что это 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];

}
person Tilo Delau    schedule 08.07.2015