将NSDictionary对象转换为自定义复杂对象

时间:2011-05-08 13:19:32

标签: json serialization nsdictionary

我需要将JSON字符串反序列化为自定义复杂对象。

例如,假设我有json字符串:

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

如何反序列化此字符串以初始化具有categoryList的Menu对象,该categoryList包含3类Category类的对象?有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

这是一种似乎不存在良好(公共)解决方案的必需功能。

答案 1 :(得分:-1)

尝试使用JSON解析器。

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

它会分析你的字符串并返回一个代表你数据的NSObject(NSArray或NSDictionary)。

编辑:

好吧,因为OP想要获得一个自定义对象而不是NSDictionary / NSArray,它可以实现如下(假设dificulty将获得正确的数据并设置每个新的对象属性)

基于code provided by @andrewsardone,在使用适合您项目的任何解决方案处理JSON解析之后,可以使用KVO轻松实现一个函数来获取具有相应属性设置的新对象

+(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];
}