2014-05-12 2 views
0

Я получаю данные от Yummly API, и я хотел бы использовать его, как если бы это были сериализованные данные JSON. Однако в настоящее время это строка, и я не могу понять, как правильно ее преобразовать. Код выглядит следующим образом:Преобразование NSString в NSData для использования в XCODE

NSString *searchParameters = @"basil"; //should be from text box 
//NSError *error1 = nil; 
NSString *searchURLName = [@"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters]; 

NSURL *searchURL = [NSURL URLWithString:searchURLName]; 
NSString *searchResults = [NSString stringWithContentsOfURL:searchURL encoding:NSUTF8StringEncoding error:nil]; 
// Here, the search results are formatted just like a normal JSON file, 
// For example: 
/* [ 
    "totalMatchCount":777306, 
    "facetCounts":{} 
    ] 
*/ 
// however it is a string, so I tried to convert it to data 

NSData *URLData = [searchResults dataUsingEncoding:NSUTF8StringEncoding]; 
URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)]; 

_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil]; 

Где-то в течение последних четырех строк, он не делал то, что должен был, и нет никаких данных в объекте данных. Любые советы или быстрые подсказки в правильном направлении очень ценятся! Спасибо you1

+1

Почему вы делаете subdataWithRange? И почему вы не снабжаете указатель NSError параметру 'error:' JSONObjectWithData ?, а затем проверяете полученное сообщение об ошибке? ?? –

ответ

0

Посмотрите на ошибки возвращается из NSJSONSerialization объекта как

NSError *error; 
_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:&error]; 
NSLog(@"%@", error); 

Это может дать вам намек на то, что это не так. Это должно работать. И почему именно вы делаете URLData = [URLData subdataWithRange:NSMakeRange(0, [URLData length] - 1)];? Вам не нужно копировать данные, если именно поэтому вы это делаете.

Плюс, похоже, Вы предполагаете, чтобы получить массив в качестве объекта верхнего уровня (судя по

/* [ 
    "totalMatchCount":777306, 
    "facetCounts":{} 
    ] 
*/ 

но это словарь. В общем, вы, вероятно, хотите, словарь, а не массив. Это он должно быть

/* { 
    "totalMatchCount":777306, 
    "facetCounts":{} 
    } 
*/ 

Но ошибка получения возвращаемые вам сказать.

0

похоже, вы чрезмерно усложнять вещи немного. Вам не нужно, чтобы принести в этих данных, как NSString. Вместо этого просто введите его как NSData и передайте его парсеру.

Try:

NSString *searchParameters = @"basil"; //should be from text box 
NSString *searchURLName = [@"http://api.yummly.com/v1/api/recipes?_app_id=myAPIId&_app_key=myAPIkey&" stringByAppendingString:searchParameters]; 

NSURL *searchURL = [NSURL URLWithString:searchURLName]; 

NSData *URLData = [NSData dataWithContentsOfURL:searchURL]; 

_searchArray = [NSJSONSerialization JSONObjectWithData:URLData options:NSJSONReadingMutableContainers error:nil]; 

Обратите внимание, что вы хотите, чтобы убедиться, что разбираемый объект JSON действительно является массив, как и ожидалось, и не/не содержит [NSNull null].

Смежные вопросы