Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top