【问题标题】:How do I get all values from a NSDictionaries inside an NSDictionary? [duplicate]如何从 NSDictionary 中的 NSDictionaries 获取所有值? [复制]
【发布时间】:2013-04-16 02:40:32
【问题描述】:

我正在使用 flickr,在示例提取中我得到了这个:

{
    "api_key" =     {
        "_content" = 3c6eeeae4711a5f478d3da796750e06b;
    };
    format =     {
        "_content" = json;
    };
    method =     {
        "_content" = "flickr.test.echo";
    };
    nojsoncallback =     {
        "_content" = 1;
    };
    stat = ok;
}

这是一个包含 5 个条目(api_key、format、method、nojsoncallback 和 stat)的字典。前 4 个整体本身就是字典。

首先,我的原始字典中有第 5 个元素,它不是字典,它只是原始字典中的最后一个条目(一个 stat=ok)。此外,我希望每个子条目中的 _content 键出现在我的单个单元格中,但我不想硬编码任何值。我是否必须设置阵列?

【问题讨论】:

  • 你试过什么?这是对 NSDictionary 的完全直接的使用。你知道结构,你知道所有的键。
  • 我想到了一个循环。 (不过,也许您实际上必须查看 NSDictionary 文档。)
  • 是的,但我想编写一个循环,在不知道键名的情况下获取每个 objectForKey。
  • 如果您在最初提出问题时提到了这一点,那就太好了。
  • 您能否详细说明您希望获得什么样的结果?我的意思是,你自己已经有了字典;它们键值对。那么你想要什么来代替呢? “在不知道键名的情况下获取每个 objectForKey” - 你的意思是你只想要像 [3c6eeeae4711a5f478d3da796750e06b, json, flickr.test.echo, 1] 这样的结果?还是什么?

标签: ios objective-c json nsdictionary flickr


【解决方案1】:

NSDictionary 有一个漂亮的小方法,叫做valueForKeyPath。这就是你的救星。

[dict valueForKeyPath:@"api_key._content"]
[dict valueForKeyPath:@"format._content"]
[dict valueForKeyPath:@"method._content"]
[dict valueForKeyPath:@"nojsoncallback._content"]

它的作用是遍历键路径并在每个 JSON 子结构中获取 content 的值。否则,您将不得不编写 for-loop 并循环遍历它。整齐吧?

【讨论】:

  • 谢谢,这很方便! :) 但是,我需要分别获取每个值并将其放入不同的单元格中。所以基本上我必须在这里创建一个开关才能在正确的单元格中输入正确的值,对吗?
  • 是的,如果您想将每个值放在不同的单元格中,您可能必须在UITableViewCellindex path 上放置一个if-else。上面提到的 JSON 解析需要在顶层循环中完成。
  • 到目前为止我已经得到了这个......for (NSString *key in flickrDictionary) { NSLog(@"the key is %@", flickrDictionary[key]); id object = flickrDictionary[key]; // this will be apikey,format,method etc... if ([object isKindOfClass:[NSDictionary class]]) { //first 4 are arrays-crsh-dicts NSLog(@"object valueForKey is %@", [object valueForKey:@"_content"]); cell.textLabel.text = [object valueForKey:@"_content"]; } else { cell.textLabel.text = flickrDictionary[key]; } } 我想我只是把它放到一个数组中
【解决方案2】:

试试这个

for (NSString *key in dictionary){
    id object = dictionary[key];
    if ([object isKindOfClass:[NSDictionary class]]) {
    //Now you can work on the dictionary object
    }
}

【讨论】:

  • 好吧,我尝试了你的建议:for (NSString *key in flickrDictionary) { id object = flickrDictionary[key]; if ([object isKindOfClass:[NSDictionary class]]) { cell.textLabel.text = [object valueForKey:@"_content"]; } } 所以我说,如果第一个键(api_key)的对象是一个字典,那么获取它的 _content 键并将其放入细胞。但是我在所有 5 个单元格中都得到了 api_key :( 我必须以某种方式使用索引路径,对吗?我希望每个子条目中的 _content 键出现在我的各个单元格中,但我不想硬编码任何值。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2011-06-29
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多