2010-08-02 1 views
1

Я использую сенсорный JSON, который отлично подходит для меня. Я смог взять массив, поместить его в словарь, сериализовать его через touchJSON и отправить его через http.Как получить значение name & url из объекта nsdictionary?

Теперь на обратном конце я получил данные и поместил их в словарь (я использую trend.json из twitter в качестве примера JSON).

Если я пытаюсь получить значение для трендов из словаря объекта, я получаю это:

2010-08-02 00:23:31.069 rateMyTaxi[30610:207] ANSWER: (
    { 
    name = "Fried Chicken Flu"; 
    url = "http://search.twitter.com/search?q=Fried+Chicken+Flu"; 
    }, 
    { 
    name = "Lisa Simpson"; 
    url = "http://search.twitter.com/search?q=Lisa+Simpson"; 
    }, 
    { 
    name = "#breakuplines"; 
    url = "http://search.twitter.com/search?q=%23breakuplines"; 
    }, 
    { 
    name = "#thingsuglypeopledo"; 
    url = "http://search.twitter.com/search?q=%23thingsuglypeopledo"; 
    }, 
    { 
    name = "Inception"; 
    url = "http://search.twitter.com/search?q=Inception"; 
    }, 
    { 
    name = "#sharkweek"; 
    url = "http://search.twitter.com/search?q=%23sharkweek"; 
    }, 
    { 
    name = "JailbreakMe"; 
    url = "http://search.twitter.com/search?q=JailbreakMe"; 
    }, 
    { 
    name = "Kourtney"; 
    url = "http://search.twitter.com/search?q=Kourtney"; 
    }, 
    { 
    name = "Shark"; 
    url = "http://search.twitter.com/search?q=Shark"; 
    }, 
    { 
    name = "Boondocks"; 
    url = "http://search.twitter.com/search?q=Boondocks"; 
    } 
) 

Если я пытаюсь получить значение имени или URL, я ничего не получаю, который расстраивает. Это данные, которые мне понадобятся. Вы можете сказать, что он находится в формате словаря, потому что он отформатирован и читается правильно для трендов. Я почти уверен, что я что-то упустил, поэтому, пожалуйста, дайте мне знать, в каком направлении следовать.

Вот код:

// this is all touch JSON magic. responseString has the full contents of trends.json 

NSString *response = [request responseString]; 
NSLog(@"response value is:%@",response); 

NSString *jsonString = response; 
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
NSError *error = nil; 
NSDictionary *dictionary = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
//end of touchJSON. It is in a dictionary now. 

NSLog(@"dictionary:%@, error %@", dictionary, error); //http://cl.ly/adb6c6a974c3e70fb51c 

NSString *twitterTrends = (NSString *) [dictionary objectForKey:@"trends"]; 
NSLog(@"ANSWER:%@",twitterTrends); //http://cl.ly/fe270fe7f05a0ea8d478 

ответ

0

При использовании печати объекта с помощью FormatString% @ вас будет выдавать вывод сообщения описания на объект. Для NSDictionary этот результат выглядит очень похоже на unparsed JSON, но это не строка, это объектный граф NSDictionaries, NSArrays, NSStrings, NSNumbers и NSDates.

Так что хотите, чтобы у вас в twitterTrends NSArray из NSDictionaries. Чтобы получить части, просто перечислите массив.

for (NSDictionary* trend in twitterTrends) { 
    NSString* url = [trend objectForKey:@"url"]; 
    NSString* name = [trend objectForKey:@"name"]; 
} 

Или вы можете получить доступ к тенденции по его индексу:

[[twitterTrends objectAtIndex:5] objectForKey:@"url"]; 
+0

Спасибо, это то, что я искал. Я взял уровень и извлек словарь тенденций в этом коде. Вот окончательный код для (NSDictionary * item в [dictionary objectForKey: @ "тенденции"]) { NSString * name = [item objectForKey: @ "name"]; NSString * url = [item objectForKey: @ "url"]; –

0

Вы только получили, насколько извлекая массив словарей. (Ответ содержит словарь внутри массива внутри словаря.)

Вам нужно извлечь каждый словарь из массива, а затем просмотреть имена и записи URL в этом словаре.

Нечто подобное должно напечатать первую запись: (! Код не был проверен так не может компилировать сразу)

NSArray *twitterTrends = [dictionary objectForKey:@"trends"]; 
NSDictionary *entry1 = [twitterTrends objectAtIndex:0]; 
NSLog(@"entry1: %@, %@", [entry1 objectForKey:@"name"], [entry1 objectForKey:@"url"]); 

+0

спасибо это помогает. –