2009-06-26 3 views
3

У меня есть словарь словарей, который возвращается ко мне в формате JSONiPhone NSArray из словаря Словарь значений

{ 
    "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.

+0

Извинения за мой преждевременный ответ - я проголосовал за его удаление. Можете ли вы пояснить, что вы уже разобрали JSON в иерархию NSDictionarys? – teabot

+1

+1 Хороший вопрос. Я попытался добавить «json» и изменил «iphone» на «какао», поскольку этот вопрос более общеприменим. –

+0

Да, я уже разбирал JSON в иерархии NSDictionaries. Это довольно просто с json-framework – Xetius

ответ

5

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

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

+ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys 
+0

Я не спрашивал, как построить словарь, а лучший способ фильтрации существующего словаря. – Xetius

0

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

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

+2

Учитывая, что он программирует на iPhone, консалтинг документации Apple является гораздо лучшей идеей ... http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/ –