Objective C将NSDictionary valueForKeyPath转换为字符串

时间:2013-07-09 18:18:52

标签: ios nsstring nsdictionary

我有一个NSDictionary,我试图从中获取一些字符串。字典的名称称为推文。我可以通过执行以下操作获取用户名和推文。

 NSDictionary *tweet = self.detailItem;
 NSString *username = [[tweet objectForKey:@"user"] objectForKey:@"name"];
 NSString *tweetText = [tweet objectForKey:@"text"];

如果我NSLog我得到的结果; username是“person's username”,tweetText是“person's tweet”。这些都是我可以操作的NSString。

但是,我还需要从推文中获取实际的URL,而不是缩短的URL。所以我在valueForKeyPath的字典中找到了它。我需要这个作为一个字符串,并尝试了以下。

NSString *url = [tweet valueForKeyPath:@"entities.urls.display_url"];

我也可以NSLog这个,我得到了正确的信息。但我认为它是一个阵列? NSLog看起来像这样.. url是(“url go here”)。用括号和引号。这不像其他字符串。我假设它是因为valueForKeyPath。当我尝试使用url hasPrefix时,它不喜欢这样,并提到你不能使用hasPrefix和数组。但我也尝试将多个objectForKey与实体,网址和display_url一起使用。但这不起作用。有没有办法让我进入字符串格式。我已经在网上查看了一些SO问题,但找不到任何对我有用的东西。任何帮助将非常感谢。谢谢你的时间

2 个答案:

答案 0 :(得分:4)

keyPath entities.urls.display_url遍历一个数组数组并展平它以返回一个display_urls数组。如果您确信该层次结构中只有一个URL,则可以使用

NSString *url = [[tweet valueForKeyPath:@"entities.urls.display_url"] lastObject];

如果有多个带URL的实体,您可能需要遍历实体和网址以确定您感兴趣的网址。或者你可以使用firstObject,如果你真正想要的是entities.urls。[0] .display_url

答案 1 :(得分:3)

Twitter's documentation on entitiesentities是字典,urls是字典数组。

当您执行... valueForKeyPath:@"entities.urls.display_url"]时,您会执行与... valueForKey:@"entities"] valueForKey:@"urls] valueForKey:@"display_url"]相同的操作。

根据NSDictionary's documentationvalueForKey:返回与objectForKey:相同的内容,如果 - 在这种情况下 - 相关的密钥不以@开头。

因此entities的{​​{1}}部分返回一个对象数组。

NSArray's documentation,其valueForKeyPath:返回一个数组,该数组包含在数组中每个对象上单独调用valueForKey:的结果。

鉴于valueForKey:数组中的每个内容都是字典,因此您获取的内容是推文中每个实体的entities键数组。

所以我认为你的问题是你希望从推文中获得“ 实际网址”(重点补充)。推文可能包含向外的任意多个链接,而不仅仅是一个 - 实体表示具有特殊含义的字符范围,如链接,主题标签和类似。所以你得到一个数组而不是一个值。