4

我有一个字典词典,它以 JSON 格式返回给我

{
    "neverstart": {
        "color": 0, 
        "count": 0, 
        "uid": 32387, 
        "id": 73129, 
        "name": "neverstart"
    }, 
    "dev": {
        "color": 0, 
        "count": 1, 
        "uid": 32387, 
        "id": 72778, 
        "name": "dev"
    }, 
    "iphone": {
        "color": 0, 
        "count": 1, 
        "uid": 32387, 
        "id": 72777, 
        "name": "iphone"
    }
}

我还有一个 NSArray,其中包含项目所需的 id。例如 [72777, 73129]

我需要做的是为数组中的项目获取一个 id => name 的字典。我知道这可以通过遍历数组,然后遍历 Dictionary 中的所有值并检查值来实现,但似乎应该有一种不那么冗长的方法来执行此操作。

请原谅我的无知,因为我只是想在 iPhone SDK 和学习 Objective C 和 Cocoa 中找到自己的方法。

4

3 回答 3

6

首先,由于您使用的是 JSON,我希望您已经找到BSJSONAdditions和/或json-framework,它们都是用于将 JSON 解析为原生 Cocoa 结构的开源项目。这篇博文介绍了如何使用后者从 JSON 字符串中获取 NSDictionary。

然后问题就变成了在字典中查找匹配值的问题。我不知道有一种方法可以满足您的要求——Cocoa 框架非常强大,但设计得非常通用和灵活。但是,用不多的行放在一起应该不会太难......(因为你是在 iPhone 上编程,我将使用快速枚举来使代码更清晰。)

NSDictionary* jsonDictionary = ...
NSDictionary* innerDictionary;
NSArray* requiredIDs = ...
NSMutableDictionary* matches = [NSMutableDictionary dictionary];
for (id key in jsonDictionary) {
    innerDictionary = [jsonDictionary objectForKey:key];
    if ([requiredIDs containsObject:[innerDictionary objectForKey:@"id"]])
        [matches setObject:[innerDictionary objectForKey:@"name"]
                    forKey:[innerDictionary objectForKey:@"id"]];
}

这段代码可能有错别字,但概念应该是正确的。另请注意,调用[NSMutableDictionary dictionary]将返回一个自动释放的对象。

于 2009-06-26T14:29:03.217 回答
2

您是否尝试过这种 NSDictionary 方法:

+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys
于 2009-06-26T12:24:43.063 回答
0

德鲁得到了答案……前几天我遇到类似问题时,我发现NSDictionary 的 GCC 手册非常有用。

http://www.gnustep.org/resources/documentation/Developer/Base/Reference/NSDictionary.html

于 2009-06-26T12:50:42.340 回答