iPhone NSArray из словаря значений словаря - PullRequest
3 голосов
/ 26 июня 2009

У меня есть словарь словарей, который мне возвращается в формате 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, содержащий идентификатор, необходимый для предмета. например [72777, 73129]

Что мне нужно сделать, так это получить словарь идентификатора id => name для элементов в массиве. Я знаю, что это возможно, выполняя итерацию по массиву, а затем перебирая все значения в Словаре и проверяя значения, но кажется, что для этого должен быть менее изощренный метод.

Извините за мое невежество, поскольку я просто пытаюсь найти способ обойти iPhone SDK и изучить Objective C и Cocoa.

Ответы [ 3 ]

5 голосов
/ 26 июня 2009

Прежде всего, поскольку вы используете JSON, я надеюсь, что вы уже нашли BSJSONAdditions и / или json-framework , оба проекта с открытым исходным кодом для Разбор JSON в нативные структуры Какао для вас. Этот пост в блоге дает представление о том, как использовать его для получения NSDictionary из строки JSON.

Тогда возникает проблема поиска подходящих значений в словаре. Я не знаю ни одного метода, который бы делал то, что вы ищете - фреймворки 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] вернет автоматически освобожденный объект.

2 голосов
/ 26 июня 2009

Вы пробовали этот метод NSDictionary:

+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys
0 голосов
/ 26 июня 2009

Дрю получил ответ ... Я обнаружил, что руководство GCC для NSDictionary было полезным совершенно незаметно на днях, когда у меня был похожий вопрос.

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

...