Как я могу получить значения name & url из обязательного объекта? - PullRequest
1 голос
/ 02 августа 2010

Я использую сенсорный JSON, который отлично сработал для меня. Мне удалось взять массив, поместить его в словарь, сериализовать его через touchJSON и отправить по http.

Теперь, с другой стороны, я получил данные и поместил их в словарь (я использую 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

Ответы [ 2 ]

0 голосов
/ 02 августа 2010

Когда вы используете print object с использованием formattring% @, вы получите вывод сообщения с описанием, отправленного объекту.Для NSDictionary эти выходные данные очень похожи на неразобранный 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 голосов
/ 02 августа 2010

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

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

Примерно так должна печататься первая запись:

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

(Код не был протестирован, поэтому может не скомпилироваться сразу!)

...