iPhone 上 Twitter 的 JSON 源

Posted

技术标签:

【中文标题】iPhone 上 Twitter 的 JSON 源【英文标题】:JSON Feed for Twitter on iphone 【发布时间】:2011-07-20 17:39:11 【问题描述】:

我正在尝试使用 SBJSON 框架处理 iPhone 的 JSON 提要。我最初确实尝试了一个示例,并且效果很好。但是当我使用我的 URL JSON 进行更改时,它找不到正确的密钥。我不确定我是否正确,因为我是学习 iPhone 的 JSON 框架的新手。以下是我的 JSON 提要:

[

    "place": null,
    "in_reply_to_user_id": null,
    "user": 
        "notifications": null,
        "friends_count": 37,
        "profile_text_color": "000000",
        "protected": false,
        "is_translator": false,
        "profile_sidebar_fill_color": "f1f6f9",
        "location": "St. Louis, MO",
        "name": "Annual Meeting",
        "follow_request_sent": null,
        "profile_background_tile": true,
        "show_all_inline_media": false,
        "geo_enabled": false,
        "utc_offset": -18000,
        "url": "http://www.center.org/meet",
        "id_str": "15336703",
        "following": null,
        "verified": false,
        "favourites_count": 0,
        "profile_link_color": "CB2828",
        "description": "Annual Meeting Twitterstream -- Join us in St. Louis, MO!",
        "default_profile": false,
        "created_at": "Sun Jul 06 23:26:33 +0000 2008",
        "profile_sidebar_border_color": "000000",
        "listed_count": 105,
        "statuses_count": 400,
        "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/20080706-rh1nqc98x97hyg133ji774pix1.jpg",
        "time_zone": "Eastern Time (US & Canada)",
        "profile_image_url": "http://a1.twimg.com/profile_images/AnnualMeeting2011_Twitter_Icon_normal.jpg",
        "profile_use_background_image": false,
        "profile_image_url_https": "https://si0.twimg.com/profile_images/1257786946/AnnualMeeting2011_Twitter_Icon_normal.jpg",
        "id": 15336703,
        "profile_background_color": "015196",
        "followers_count": 2311,
        "screen_name": "11",
        "contributors_enabled": false,
        "profile_background_image_url": "http://a3.twimg.com/profile_background_images/20080706-rh1nqc98x97hyg133ji774pix1.jpg",
        "default_profile_image": false,
        "lang": "en"
    ,
    "in_reply_to_status_id": null,
    "text": "Acronym blog is seeking guest bloggers at #11 http://bit.ly/nlDUOe",
    "id_str": "91972636405530624",
    "favorited": false,
    "created_at": "Fri Jul 10 20:49:19 +0000 2011",
    "in_reply_to_status_id_str": null,
    "geo": null,
    "in_reply_to_screen_name": null,
    "id": 91972636405530620,
    "in_reply_to_user_id_str": null,
    "source": "<a href=\"http://cotweet.com/?utm_source=sp1\" rel=\"nofollow\">CoTweet</a>",
    "contributors": null,
    "coordinates": null,
    "retweeted": false,
    "retweet_count": 2,
    "truncated": false
,

找出正确密钥的代码:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
[connection release];


NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];

NSDictionary *results = [responseString JSONFragmentValue];
NSArray *allTweets = [results objectForKey:@"user"]; // ** Error on this line, dont know what key is the correct one ? **///
[viewController setTweets:allTweets];
    [window addSubview:viewController.view];
   [window makeKeyAndVisible];

【问题讨论】:

【参考方案1】:
try this one

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];

NSError *error;

SBJSON *json = [[SBJSON new] autorelease];




NSDictionary *results = [json objectWithString:responseString error:&error];

NSArray *allTweets = [[results objectForKey:@"user"]retain]; 

[viewController setTweets:allTweets];

[window addSubview:viewController.view];

[window makeKeyAndVisible];

【讨论】:

它给出了与上面相同的错误。我不确定它是如何工作的。【参考方案2】:

这可能是因为你的 JSON 被格式化为一个数组(外部 []...我猜你的帖子不完整,因为它以逗号结尾)所以你应该有

NSArray *results = [responseString JSONValue];

然后参考[results objectAtIndex:0]

【讨论】:

我只贴了一半。我已经检查并确认我的 JSON 文件是正确的。我需要字典中的所有数据,并带有一个包含该字典的数组。 对,所以,因为它是一个数组,所以把它变成一个数组,而不是字典(看到我的行以'NSArray'而不是'NSDictionary)'开头......然后字典你真正想要的是那个数组的零对象 这对你有用吗?我只是再看一遍,我意识到问题可能是给出错误的行试图从结构为字典的数据创建一个数组......您可能还需要将用户对象包装在括号中以使其成为一个对象数组?但我只是把它作为一个假设扔在那里......我不知道使用键/值对无法形成数组【参考方案3】:

您正在将一个值返回到一个 NSDictionary 对象中,但您的 JSON 将返回一个数组。 JSONFragmentValue 消息返回id,这就是为什么这个调用不会导致错误:

NSDictionary *results = [responseString JSONFragmentValue];

但是,尽管您将 results 声明为 NSDictionary,但它实际上是一个 NSArray。如果您向 NSArray 实例发送 objectForKey: 消息,它们将抛出错误。

PS:您使用的是一个可怕的旧版本 SBJson。 升级!新版本中修复了许多错误。

【讨论】:

以上是关于iPhone 上 Twitter 的 JSON 源的主要内容,如果未能解决你的问题,请参考以下文章

iphone json twitter 网络服务问题

以 JSON 格式获取 Twitter 订阅源,无需身份验证

来自 mysql/JSON 的 twitter bootstrap typeahead 源

新推特中的RSS提要

使用 MGTwitterEngine iphone 在 Twitter 上关注

Twitter上有人分享几张据称是iPhone8正面玻璃盖板的照片