2011-11-29 179 views
4

我以JSON格式获得响应,并且从未解析过它,所以有人可以帮我理解这一点。 这里的JSON响应我得到:如何从JSON中获取数据?

微博回应:

(
    { 
     contributors = "<null>"; 
     coordinates = "<null>"; 
     "created_at" = "Tue Nov 29 15:48:35 +0000 2011"; 
     entities =   { 
      hashtags =    (
      ); 
      media =    (
           { 
        "display_url" = "pic.twitter.com/650E1WRY"; 
        "expanded_url" = "http://twitter.com/ashu1702/status/141544088850796545/photo/1"; 
        id = 141544088854990848; 
        "id_str" = 141544088854990848; 
        indices =      (
         22, 
         42 
        ); 
        "media_url" = "http://p.twimg.com/AfbdmVBCEAAPJvT.jpg"; 
        "media_url_https" = "https://p.twimg.com/AfbdmVBCEAAPJvT.jpg"; 
        sizes =      { 
         large =       { 
          h = 279; 
          resize = fit; 
          w = 215; 
         }; 
         medium =       { 
          h = 279; 
          resize = fit; 
          w = 215; 
         }; 
         small =       { 
          h = 279; 
          resize = fit; 
          w = 215; 
         }; 
         thumb =       { 
          h = 150; 
          resize = crop; 
          w = 150; 
         }; 
        }; 
        type = photo; 
        url = "http://t.co/650E1WRY"; 
       } 
      ); 
      urls =    (
      ); 
      "user_mentions" =    (
      ); 
     }; 
     favorited = 0; 
     geo = "<null>"; 
     id = 141544088850796545; 
     "id_str" = 141544088850796545; 
     "in_reply_to_screen_name" = "<null>"; 
     "in_reply_to_status_id" = "<null>"; 
     "in_reply_to_status_id_str" = "<null>"; 
     "in_reply_to_user_id" = "<null>"; 
     "in_reply_to_user_id_str" = "<null>"; 
     place = "<null>"; 
     "possibly_sensitive" = 0; 
     "retweet_count" = 0; 
     retweeted = 0; 
     source = "<a href=\"http://www.apple.com\" rel=\"nofollow\">iOS</a>"; 
     text = "I am in Syria @(null) http://t.co/650E1WRY"; 
     truncated = 0; 
     user =   { 
      "contributors_enabled" = 0; 
      "created_at" = "Sun May 01 15:20:52 +0000 2011"; 
      "default_profile" = 1; 
      "default_profile_image" = 1; 
      description = "<null>"; 
      "favourites_count" = 0; 
      "follow_request_sent" = "<null>"; 
      "followers_count" = 0; 
      following = "<null>"; 
      "friends_count" = 5; 
      "geo_enabled" = 0; 
      id = 291164338; 
      "id_str" = 291164338; 
      "is_translator" = 0; 
      lang = en; 
      "listed_count" = 0; 
      location = "<null>"; 
      name = "Ashutosh Tiwari"; 
      notifications = "<null>"; 
      "profile_background_color" = C0DEED; 
      "profile_background_image_url" = "http://a0.twimg.com/images/themes/theme1/bg.png"; 
      "profile_background_image_url_https" = "https://si0.twimg.com/images/themes/theme1/bg.png"; 
      "profile_background_tile" = 0; 
      "profile_image_url" = "http://a2.twimg.com/sticky/default_profile_images/default_profile_3_normal.png"; 
      "profile_image_url_https" = "https://si0.twimg.com/sticky/default_profile_images/default_profile_3_normal.png"; 
      "profile_link_color" = 0084B4; 
      "profile_sidebar_border_color" = C0DEED; 
      "profile_sidebar_fill_color" = DDEEF6; 
      "profile_text_color" = 333333; 
      "profile_use_background_image" = 1; 
      protected = 0; 
      "screen_name" = ashu1702; 
      "show_all_inline_media" = 0; 
      "statuses_count" = 62; 
      "time_zone" = "<null>"; 
      url = "<null>"; 
      "utc_offset" = "<null>"; 
      verified = 0; 
     }; 
    } 
) 

具体来说,我需要的只是“expanded_url”,我在我的代码,这样做是为了得到它:

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];// where response data is coming from the call made to twitter timeline_api 

          NSString * callBackURL = [dict objectForKey:@"expanded_url"]; 

在做这个我得到这个错误:

2011-11-29 09:50:31.214 L'Occitane[1119:19d07] -[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x85a50d0 
2011-11-29 09:50:31.215 L'Occitane[1119:19d07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x85a50d0' 

PLease help !!!

谢谢,

回答

7

当转换为可可Foundation对象,JSON分解成一束嵌套NSArraysNSDictionary S的最终导致NSString S,NSNumber S和NSNull秒。理想情况下,您可以从Web服务的文档转发,但您可以从根对象通过NSLog打印的描述向后工作。

从您的日志中,我可以看到expanded_url是未命名对象的成员,它是对象entities对象的成员中的第一个条目。包含entities的未命名对象是数组的一部分,这是JSON解串器将返回的内容。所以,你想这样做(如果长格式博览会写出来,没有任何验证):

NSArray *result = [NSJSONSerialization ... 

NSDictionary *firstObject = [result objectAtIndex:0]; 
NSDictionary *entities = [firstObject objectForKey:@"entities"]; 
NSArray *media = [entities objectForKey:@"media"]; 
NSDictionary *relevantObject = [media objectAtIndex:0]; 
NSString *expandedUrl = [relevantObject objectForKey:@"expanded_url"]; 

的主要风险在那里的是,Web服务可能会返回一个空数组为media,造成objectAtIndex:0引发一个异常,或者它会返回除数组之外的其他东西作为根对象,或者以某种方式调整某行中某处的类型。 Objective-C关于消息传递的通常规则nil应该可以帮助您避免使用字典时遇到的大多数问题。相当多的验证适用于判断电话。

+0

非常感谢! – Ashutosh