将嵌套的NSDictionary映射到自定义模型

时间:2013-02-21 01:24:24

标签: objective-c macos cocoa model nsdictionary

我从xml文件中读取数据,简化的NSDictionary看起来像这样:

{
    Name = "Song Title";
    Album = "Album Title";
    "Album Artist" = "Album Artist Title";
    Artist = "Artist Title";
}, ...

我想制作模型ITSongITArtistITAlbum,等等。
结构应该是智能的,所以我可以用ITComposer或其他任何东西扩展它。

问题是模型是嵌套的 ITArtist应该包含ITAlbum个数组,而ITAlbum应该包含ITSong个数组。

这需要一堆嵌套的for循环,检查特定键的唯一NSString,并且必须为专辑,艺术家,专辑艺术家等重复。这似乎不是一个很好的解决方案。

我想检查是否有可以执行此操作的库。而不是重新发明轮子。

如何以正确的方式将复杂的NSDictionary映射到自定义模型?

感谢。

4 个答案:

答案 0 :(得分:2)

RestKit(http://restkit.org,你还需要https://github.com/RestKit/RKXMLReaderSerialization)很好地将XML和JSON反序列化为Objective-C类。您可以定义XML和类之间的关系,它将自动创建对象。

答案 1 :(得分:0)

您的父模型对象应该负责初始化子对象。

让我们说ITArtist

-(id)initWithDictionary:(NSDictionary*)artistDictionary {
    self = [super init];
    if (self) {
        self.artistName = [artistDictionary valueForKey:@"name"];
        NSMutableArray *albumObjects = [NSMutableArray new];
        NSArray *albumDicts = [artistDictionary valueForKey:@"albums"];
        for each albumDict {
               ITAlbum *albumModelObject = [[ITAlbum alloc] initWithDictionary:albumDict];//This should take care of initializing the songs
              [albumObjects addObject:albumModelObject];
               [albumModelObject release];
        }
       self.albums =  albumObjects;
       [albumObjects release];
    }
    return self;
}

答案 2 :(得分:0)

我打赌有一个框架可以做到这一点,但接着Key-Value-Coding应该提供你需要的所有东西。我创建了一个基类,比如说ITObject带有使用setAttributesFromDictionary:

的初始化程序
- (id)initWithDict:(NSDictionary *)dict {
    if (self = [super init]) {
        [self setAttributesFromDictionary:dict];
    }
    return self;
}

这将照顾您的所有正常属性。对于嵌套的dicts和数组,您只需实现(例如在ITArtist:ITObject中)类似

的内容
- (void)setValue:(id)value forKey:(NSString *)key {
    if ([key isEqualToString:@"albums"]) {
        if ([value isKindOfClass:[NSArray class]]) {
            NSMutableArray *myMembers = [NSMutableArray arrayWithCapacity:[value count]];
            for (id valueMember in value) {
                ITAlbum *album = [[[ITAlbum alloc] initWithDict:valueMember] autorelease];
                [myMembers addObject:album];
            }
            self.albums = myMembers;
        }
    } else {
        [super setValue:value forKey:key];
    }
}

答案 3 :(得分:0)

为什么不考虑根据自定义数据集拥有XML文件然后拥有NSDictionary,请查看此处的一个示例... Simple XML to NSDictionary Converter