访问 NSDictionary 值 Objective C

Posted

技术标签:

【中文标题】访问 NSDictionary 值 Objective C【英文标题】:Accessing NSDictionary values Objective C 【发布时间】:2015-10-02 05:33:46 【问题描述】:

我的字典看起来像这样。


 thread = "
 \"uuid\": \"e9290344dee38c42782\",
 \"site_full\": \"www.independent.co.uk\",
 \"main_image\":\"http://www.independent.co.uk/incoming/article10498560.ece/binary/original/39-tea-party-ap.jpg\"
 ";
  

[newDict valueForKeyPath:@"thread.main_image"];

我正在尝试这样访问它,但它我可以获得线程之外的所有其他值,但不能获得线程中的嵌套值。感谢任何帮助。

编辑

      for (int i=0;i < [responseObject count];i++) 
                NSDictionary* newDict = (NSDictionary*)responseObject[i];

                    if ([(NSString*)[newDict valueForKey:@"title"]  isEqualToString: @""] || [newDict valueForKey:@"title"]== Nil)  
                        NSLog(@"Image or Title Text is null");
                    
                    else
                    NewsFeed* newsData = [NewsFeed new];
                    newsData.newsSource = [newDict valueForKeyPath:@"thread.site"];
                    newsData.newsImageLink = [newDict valueForKeyPath:@"thread.main_image"];
              //these three work fine
                    newsData.newsTitle = [newDict valueForKeyPath:@"title"];
                    newsData.newsText = [newDict valueForKeyPath:@"text"];
                    newsData.newsDate = [newDict valueForKeyPath:@"published"]; 
              //
                    NSLog(@"news Source :: %@ \n and news ImageLink:: %@ \n news Title %@  \nnews Text:: %@ \n news Date::  %@  ",newsData.newsSource,newsData.newsImageLink,newsData.newsTitle,newsData.newsText,newsData.newsDate);
                    [NewsData addObject:newsData];
                    


        

【问题讨论】:

请说明您尝试了哪些代码,以及它的不足之处。 我已经添加了代码并且响应以数组的形式出现.. 【参考方案1】:

看起来存储在索引下标"thread" 处的对象不是假设的NSDictionary,而是似乎是NSString 的一个实例。

这很微妙,但请查看根级字典中键 "thread" 处对象的打印值:

This is an NSDictionary with one key: "thread"
|
|         This is an NSString object, see the quotes (")?
|         |
V         |                     Notice that these other keys/values have their quotes (") escaped with backslash?
         V                     |
 thread = "                    V
 \"uuid\": \"e9290344dee38c42782\",
 \"site_full\": \"www.independent.co.uk\",
 \"main_image\":\"http://www.independent.co.uk/incoming/article10498560.ece/binary/original/39-tea-party-ap.jpg\"
 ";
 ^
  |
  Here is the end of the NSString, again we see quotes (")

假设这确实是问题所在,您需要将字符串转换为实际字典,您应该可以轻松做到这一点using JSON serialization which this question/answer should help guide you to do.

一旦这个问题得到纠正,您对valueForKeyPath: 的使用应该是正确的并且应该立即开始工作。

【讨论】:

刚刚检查过...确实是问题所在,建议的链接解决方案正是我想要的..非常感谢..【参考方案2】:

试试这个现代的 Objective-C 代码:

NSDictionary *myDict = @@"thread" : @@"uuid" : @"e9290344dee38c42782", @"site_full" : @"www.independent.co.uk", @"main_image" : @"http://www.independent.co.uk/incoming/article10498560.ece/binary/original/39-tea-party-ap.jpg";
NSLog(@"Image = %@", myDict[@"thread"][@"main_image"]);

编辑:在附加调试器屏幕截图的 OP 响应后:

【讨论】:

在调试 po newDict[@"thread"] 如果我这样做,它会列出所有的键和它的值但是当我这样做时 po myDict[@"thread"][@"main_image"]它给出了这个错误错误:警告:无法获取 cmd 指针(替换为 NULL):在此帧中找不到名为“_cmd”的变量执行被中断,原因:尝试取消引用无效的 ObjC 对象或向其发送无法识别的选择器。进程已经返回到表达式求值前的状态。 这对我来说就像一个魅力。请参阅我的调试器附带的屏幕截图。我正在使用 Xcode 7。 正如 Thuggish 上面指出的那样,您似乎没有使用真正的字典,这就是您看不到它工作的原因。如果您尝试使用我的示例字典,它应该可以工作。所以这里的关键是检查您的传入数据并将其更正到正确的字典中。 是的,这就是问题所在..感谢人们的帮助..:)

以上是关于访问 NSDictionary 值 Objective C的主要内容,如果未能解决你的问题,请参考以下文章

我可以从一个键值访问 NSDictionary 中的所有值吗?

在 Swift 中访问 JSON NSDictionary 对象值的简单方法?

尝试从 json 创建的 nsdictionary 访问信息

NSDictionary 保留崩溃

NSDictionary实现原理

NSDictionary底层实现原理