【问题标题】:Parsing Search Result with MGTwitterEngine in Objective C在 Objective C 中使用 MGTwitterEngine 解析搜索结果
【发布时间】:2009-12-05 15:04:02
【问题描述】:

我在一个 iPhone 项目中使用了 Matt Gemmell 令人惊叹的 MGTwitterEngine,而我对 Obj-C 和 JSON 解析的不熟悉使得一项简单的工作看起来相当令人生畏。

我读过this link,虽然它有助于我理解数据的结构,但我似乎仍然无法解析它。

如果我像这样对 getSearchResultsForQuery 的输出进行 NSLog:

NSLog(@"getSearchResultsForQuery: connectionIdentifier = %@", [myTwitterEngine getSearchResultsForQuery:@"#joke" sinceID:0 startingAtPage:1 count:5]);

我在控制台中得到了这个:

2009-12-05 00:14:46.518 Entendu[90565:207] getSearchResultsForQuery: connectionIdentifier = DED541CB-A3DA-4C04-8B23-ED20D13B147E
2009-12-05 00:14:46.843 Entendu[90565:207] Request succeeded for connectionIdentifier = DED541CB-A3DA-4C04-8B23-ED20D13B147E
2009-12-05 00:14:46.884 Entendu[90565:207] Got search results for DED541CB-A3DA-4C04-8B23-ED20D13B147E:
(
        {
        "created_at" = 1259989857;
        "from_user" = royanramadhan;
        "from_user_id" = 64716299;
        geo = <null>;
        id = 6361369664;
        "iso_language_code" = sv;
        "profile_image_url" = "http://a3.twimg.com/profile_images/455943541/Dup_01_Foto006_normal.jpg";
        source = "<a href=\"http://m.twitter.com/\" rel=\"nofollow\">mobile web</a>";
        "source_api_request_type" = 37;
        text = "kenapa di keybord komputer tulisnya \"ENTER\" ? #joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259988269;
        "from_user" = alivenkickin;
        "from_user_id" = 2547330;
        geo = <null>;
        id = 6360783744;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/65068323/calvin_normal.jpg";
        source = "<a href=\"http://www.tweetdeck.com/\" rel=\"nofollow\">TweetDeck</a>";
        "source_api_request_type" = 37;
        text = "RT @andycrash: A nice, calm and respectable lady went into the pharmacy...#joke http://bit.ly/BGDfJ";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259988217;
        "from_user" = lilbytes;
        "from_user_id" = 18943691;
        geo = <null>;
        id = 6360764474;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/477338701/twitterProfilePhoto_normal.jpg";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "RT @Pyeman: LOL - Great post RT @cahlan: RT @jac_: Christmas light fun: http://bit.ly/828q7K #lol #funny #joke #christmas";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259987890;
        "from_user" = jscognam;
        "from_user_id" = 41472147;
        geo = <null>;
        id = 6360648482;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/432856397/AJ_normal.png";
        source = "<a href=\"http://www.tweetdeck.com/\" rel=\"nofollow\">TweetDeck</a>";
        "source_api_request_type" = 37;
        text = "RT @jokestweet: Give me ambiguity or give me something else. #joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259987587;
        "from_user" = jokestweet;
        "from_user_id" = 54008906;
        geo = <null>;
        id = 6360534281;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/403925746/jokes_twitter_normal.jpg";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "Give me ambiguity or give me something else. #joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259987426;
        "from_user" = RickyRicardoABN;
        "from_user_id" = 79758746;
        geo = <null>;
        id = 6360472740;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/554599647/l_92120d47e5744fee9da32c4ac71b9eee_normal.jpg";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "#Why do people tell you when they are speechless? #joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259984750;
        "from_user" = socialEspeaking;
        "from_user_id" = 80950838;
        geo = <null>;
        id = 6359413973;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/542502866/jack_sm_normal.jpg";
        source = "<a href=\"http://apiwiki.twitter.com/\" rel=\"nofollow\">API</a>";
        "source_api_request_type" = 37;
        text = "RT @andycrash A nice, calm and respectable lady went into the pharmacy...#joke http://x4.lol.0sp.in o_O";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259984140;
        "from_user" = oceanbutterfly7;
        "from_user_id" = 70740820;
        geo = <null>;
        id = 6359164521;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/558958306/Tiger-puppy_love_normal.jpg";
        source = "<a href=\"/devices\" rel=\"nofollow\">txt</a>";
        "source_api_request_type" = 37;
        text = "@jokestweet: \" Hire a teenage while they still know everything,\" #joke";
        "to_user" = jokestweet;
        "to_user_id" = 54008906;
    },
        {
        "created_at" = 1259983842;
        "from_user" = "Fab_DTY";
        "from_user_id" = 51115644;
        geo = <null>;
        id = 6359037805;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/515204077/moto_0326_normal.jpeg";
        source = "<a href=\"http://ubertwitter.com\" rel=\"nofollow\">UberTwitter</a>";
        "source_api_request_type" = 37;
        text = "RT @nutshellcards: Energizer Bunny arrested, charged with battery. lmao #Joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983640;
        "from_user" = chunyip;
        "from_user_id" = 1221169;
        geo = <null>;
        id = 6358953626;
        "iso_language_code" = en;
        "profile_image_url" = "http://s.twimg.com/a/1259808911/images/default_profile_6_normal.png";
        source = "<a href=\"http://mobileways.de/gravity\" rel=\"nofollow\">Gravity</a>";
        "source_api_request_type" = 37;
        text = "RT @jokestweet: If electricity comes from electrons, does that mean that morality comes from morons? #joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983356;
        "from_user" = nutshellcards;
        "from_user_id" = 54486591;
        geo = <null>;
        id = 6358837191;
        "iso_language_code" = en;
        "profile_image_url" = "http://a3.twimg.com/profile_images/515618469/blue_normal.png";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "Energizer Bunny arrested, charged with battery. lmao\n#Joke";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983222;
        "from_user" = sagewhistler;
        "from_user_id" = 3737203;
        geo = <null>;
        id = 6358780332;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/552759084/cowboycig_normal.GIF";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "#Joke \"What's the shotgun for?\" asks the homeowner. The bear remover replies, \"If the bear knocks me off the roof, shoot the dog.\" [end]";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983181;
        "from_user" = sagewhistler;
        "from_user_id" = 3737203;
        geo = <null>;
        id = 6358763080;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/552759084/cowboycig_normal.GIF";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "#Joke The bear will then be subdued enough for me to put him in the cage in the back of the van.\"He hands the shotgun to the homeowner...";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983144;
        "from_user" = sagewhistler;
        "from_user_id" = 3737203;
        geo = <null>;
        id = 6358748440;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/552759084/cowboycig_normal.GIF";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "#Joke When the bear falls off, the pit bull is trained to grab his testicles and not let go...";
        "to_user_id" = <null>;
    },
        {
        "created_at" = 1259983112;
        "from_user" = sagewhistler;
        "from_user_id" = 3737203;
        geo = <null>;
        id = 6358736099;
        "iso_language_code" = en;
        "profile_image_url" = "http://a1.twimg.com/profile_images/552759084/cowboycig_normal.GIF";
        source = "<a href=\"http://twitter.com/\">web</a>";
        "source_api_request_type" = 37;
        text = "#Joke \"I'm going to put this ladder up against the roof, then I'm going to go up there & knock the bear off the roof with this baseball bat";
        "to_user_id" = <null>;
    },
        {
        "completed_in" = 0;
        "max_id" = 6361369664;
        "next_page" = "?page=2&max_id=6361369664&q=%23joke";
        page = 1;
        query = "%23joke";
        "refresh_url" = "?since_id=6361369664&q=%23joke";
        "results_per_page" = 15;
        "since_id" = 0;
        "source_api_request_type" = 37;
    }
)

奇怪的是我有 count:5,但​​我得到了更多的结果。

对于实际的解析,我是否会将输出保存到一个 NSArray,然后是一个 NSDictionary,例如我可以使用 valueForKey:@"text" 进行查询?

我知道也调用了两个委托方法(requestSucceeded: 和 searchResultsReceived:forRequest:),但我不确定这会如何影响解析。

searchResultsReceived:forRequest: 的实际委托方法是:

- (void)searchResultsReceived:(NSArray *)searchResults forRequest:(NSString *)connectionIdentifier
{
 NSLog(@"Got search results for %@:\r%@", connectionIdentifier, searchResults);
}

这表明结果实际上是由变量 searchResults 存储的。

不过,我如何获取单个字符串?

感谢您的帮助!

【问题讨论】:

    标签: iphone objective-c twitter nsdictionary


    【解决方案1】:

    您的委托中的 searchResults 变量是一个字典数组。您只需索引该数组,然后开始获取字典中键的值。例如

    - (void)searchResultsReceived:(NSArray *)searchResults 
                       forRequest:(NSString *)connectionIdentifier
    {
        if ([searchResults count] > 0)
        {
            NSDictionary *result = [searchResults objectAtIndex:0];
    
            NSString *fromUser = [result valueForKey:@"from_user"];
            NSString *fromUserID = [result valueForKey@"from_user_id"];
            // ...
            NSString *text = [result valueForKey@"text"];
    
            NSLog(@"User %@(%@): %@", fromUser, fromUserID, text);
        }
    }
    

    【讨论】:

    • 谢谢!这为我提供了一种继续处理数据的方法。要访问委托函数范围之外的单个字符串,我可以设置一个返回类型 Array 并返回一个只包含我需要的信息的字符串吗?或者只是返回原始数组本身以在其他地方进行提取?再次感谢!
    • 您可以只创建一个 NSArray 实例变量 (ivar) 属性并保留它,例如[自我 setItems:searchResults];这将需要将您的实例变量声明为属性,例如 @property (assign) NSArray *items;在你的 .h 中,然后在 .m 中 @synthesize 项目。
    【解决方案2】:

    我不确定你需要做什么解析。您应该为引擎提供一个委托(如回调,但实际上是一个对象),引擎将在它有结果时使用它来通知您。结果应该以NSDictionarys 的NSArray 形式返回,这意味着您根本不需要进行任何解析。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 2011-10-11
      • 2013-02-09
      • 2023-03-29
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多