Преобразование объекта NSDictionary в пользовательские сложные объекты - PullRequest
0 голосов
/ 08 мая 2011

Мне нужно десериализовать строку JSON для пользовательских сложных объектов.

Например, допустим, у меня есть строка json:

{"Menu": {
"categoryList": {
"Category": [
{"name": "Cat1"},
{"name": "Cat1"},
{"name": "Cat3"}
]
}
}}

Как я могу десериализовать эту строку, чтобы инициализировать объект Menu, у которого есть categoryList, который включает 3 объекта категории типа Category class? Есть ли способ к этому?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2012

Это необходимая возможность, для которой не существует хорошего (общедоступного) решения.

0 голосов
/ 08 мая 2011

Попробуйте использовать анализатор JSON.

http://code.google.com/p/json-framework/

Он проанализирует вашу строку и вернет вам NSObject (NSArray или NSDictionary), который представляет ваши данные.

EDIT:

Ну, так как ОП хотел получить пользовательский объект вместо NSDictionary / NSArray, он мог бы быть реализован в следующем виде (при условии, что сложности получат правильные данные и установят каждое из новых свойств объекта)

На основе кода , предоставленного @ andrewsardone , можно легко реализовать функцию с помощью KVO для получения нового объекта с соответствующими свойствами, после обработки анализа JSON любым решением, которое лучше подходит вашему проекту

+(id) objectFromDictionary:(NSDictionary *)dict {

    id entry = [[self alloc] init];

    Class aClass = [entry class];

    do {

        unsigned int outCount, i;
        objc_property_t *properties = class_copyPropertyList(aClass, &outCount);
        for (i = 0; i < outCount; i++) {
            objc_property_t property = properties[i];
            NSString *propertyName = [[[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding] autorelease];
            id propertyValue = [dict objectForKey:propertyName];
            if (propertyValue && ![propertyValue isEqual:[NSNull null]]) {
                [entry setValue:propertyValue forKey:propertyName];
            }
        } 

        free(properties);

        //added to take care of the class inheritance
        aClass = [aClass superclass];

    } while (![[[aClass class] description] isEqualToString:[NSObject description]]);

    return [entry autorelease];
}
...