2014-02-04 3 views
0

У меня есть ответ JSON, который выглядит следующим образом:JSON и IOS 7 ошибок

{"load_count":171,"play_count":142,"play_rate":0.9292035398230089,"hours_watched":2.795013611111111,"engagement":0.708595,"visitors":113} 

Когда я пытаюсь установить переменные значения здесь:

- (id)initWithJSONDictionary:(NSDictionary *)jsonDictionary { 
if(self = [self init]) { 
    // Assign all properties with keyed values from the dictionary 
    _plays = [jsonDictionary objectForKey:@"load_count"]; 
    _hoursWatched = [jsonDictionary objectForKey:@"hours_watched"]; 
    _engagement = [jsonDictionary objectForKey:@"engagement"]; 

} 

return self; 

}

я эта ошибка:

2014-02-04 11:16:37.180 BluGiant2[21192:1303] -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x10a1176d0 
2014-02-04 11:16:37.181 BluGiant2[21192:1303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x10a1176d0' 

так что это basica что я не могу найти «load_count», хотя он есть. Является ли проблема, что это не объект, поскольку нет [] вокруг JSON?

Это только вторая попытка загрузки JSON для меня, а другая работает, единственная разница, которую я вижу, - это недостающее [].

Вот где я это называю:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"https://%s:%[email protected]/v1/stats/medias/c3e4797d8f.json", "api", "1b75e458de33a9b3f99d33f6bf409a7e145c570a"]]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setURL:url]; 
[request setHTTPMethod:@"GET"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

NSError *error; 
NSURLResponse *response; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    NSMutableArray *videoDetail = [[NSMutableArray alloc] init]; 

    // Get an array of dictionaries with the key "locations" 
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
    // Iterate through the array of dictionaries 
    for(NSDictionary *dict in array) { 
     // Create a new Location object for each one and initialise it with information in the dictionary 
     VideoDetail *videoD = [[VideoDetail alloc] initWithJSONDictionary:dict]; 
     // Add the Location object to the array 
     [videoDetail addObject:videoD]; 

     _textPlays.text = [NSNumberFormatter localizedStringFromNumber:videoD.plays numberStyle:NSNumberFormatterNoStyle]; 

    } 


} 
+1

Вы разбираете строку вообще или просто передаете строку JSON этому методу? –

+0

Как вы вызываете '- (id) initWithJSONDictionary: (NSDictionary *) jsonDictionary'? –

+0

Сначала нужно разобрать JSON. –

ответ

2

сообщение об ошибке вы получаете выпускающая вы знаете, что JSON хранится в виде строки, а не как NSDictionary. Что вам нужно сделать, это конвертировать JSON.

Поскольку ваш JSON является строкой, то получите NSData объект первым:

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 

Затем включите его в NSDictionary используя NSJSONSerialization класс:

NSError* error = nil; 
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 

В этот момент, вы будете иметь NSDictionary, с которым вы можете работать.

EDIT:

Похоже, вы пытаетесь лечить ваш ответ JSON как массив словарей, но на основе ответа JSON вы вставили выше, вы на самом деле просто есть словарь. Поэтому не перебирайте его, потому что я считаю, что именно поэтому вы столкнулись с вашей проблемой. Это просто повторение ключей, которые являются строками.

+0

Так что не используйте массив перед словарем? Я отредактировал сообщение и включил код вызова. –

+0

Да, это правильно. Я просто добавил дополнительную информацию в свой ответ на основе вашего добавленного кода. – Gavin

0

Давайте поясним, что: JSON, который вы разместили, представляет собой текст, содержащий словарь. Документы JSON состоят либо из одного словаря, либо из одного массива.

Если вы передали JSON, который вы отправили в JSONObjectWithData, вы получите NSDictionary *. Не имеет значения, что вы храните его в NSArray *; компилятор не знает, что он получает, поэтому позволяет присваивать, но у вас все еще есть NSDictionary.

Цикл for fun: for (... in ...) принимает массивы, словари, наборы и выполняет итерации по значениям в массиве, словаре или наборе. Итак, вы подумали, что вы итерации через массив, но вы действительно перебираете значения в словаре, которые являются целыми. Как и прежде, тот факт, что вы написали (NSDictionary * dict ...), не имеет значения, dict всегда будет NSString.

И это приводит к точно полученной ошибке: вы отправили метод objectForKey в NSString, который, конечно же, не имеет никакого отношения к этому, и выдает исключение.