iPhone NSArray из словаря значений словаря

У меня есть словарь словарей, который возвращается мне в формате 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.


person Xetius    schedule 26.06.2009    source источник
comment
Извиняюсь за преждевременный ответ - я проголосовал за его удаление. Можете ли вы уточнить, что вы уже разобрали JSON в иерархию NSDictionarys?   -  person teabot    schedule 26.06.2009
comment
+1 Хороший вопрос. Я изменил тег, чтобы добавить json, и изменил iphone на какао, так как этот вопрос более универсален.   -  person Quinn Taylor    schedule 26.06.2009
comment
Да, я уже разобрал JSON в иерархию NSDictionaries. Это довольно просто с json-framework   -  person Xetius    schedule 27.06.2009


Ответы (3)


Во-первых, поскольку вы используете JSON, я надеюсь, вы уже нашли BSJSONAdditions и/ или json-framework, оба проекта с открытым исходным кодом для преобразования JSON в собственный Cocoa. структуры для вас. Это сообщение в блоге дает представление о том, как использовать последний для получения 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] вернет автоматически выпущенный объект.

person Quinn Taylor    schedule 26.06.2009

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

+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys
person drewh    schedule 26.06.2009
comment
Я не спрашивал, как создать словарь, а как лучше всего отфильтровать существующий словарь. - person Xetius; 27.06.2009

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

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

person Jim Carroll    schedule 26.06.2009
comment
Учитывая, что он программирует для iPhone, лучше обратиться к документации Apple... developer.apple.com/documentation/Cocoa/Reference/Foundation/ - person Quinn Taylor; 26.06.2009