Objective-C,JSON和对象映射

时间:2012-04-03 14:34:58

标签: objective-c json cocoa mapping nsdictionary

我正在做一些自制的解析和“对象映射”,你会看到,目前不是真正的对象映射但是我的目标,我需要先找到最好的方法。

当前的简化代码示例

分析器

今天我有一些专为我的应用程序制作的解析器,这是关键方法,你会得到它。

-(void)jsonParserDidFinishParsing:(NSDictionary *)dic fromFile:(BOOL)file
{
    if ([dic objectForKey:@"timeline"]) {
        NSArray *items = [dic objectForKey:@"timeline"]; 
            for (NSDictionary *item in items) {
                MSTimelineItem *aItem = [[MSTimelineItem alloc]initWithDic:item]; 
                [delegate timelineParserDidParseAnItem:aItem];
            }
            [delegate timelineParserDidFinishParsing]; 
     }
}

模型

我有一些像这样的标准构造函数的模型(当然,在我真正的应用程序键中是常量)。

-(id)initWithDic:(NSDictionary *)dic
{
    self = [super init]; 
    if (self) {
        _udid = [dic objectForKey:@"udid"]; 
        _picUrl = [dic objectForKey:@"profile"]; 
        _name = [dic objectForKey:@"name"]; 
        _job = [dic objectForKey:@"job"]; 
    }
    return self; 
}

目标

使其更具动态性,避免在进行服务器更改时更改本地密钥。 做些漂亮的东西......

方法

避免使用所有构造函数代码,我的方法是使用KVC,名称属性同名JSON键被命名,只保留我的 @dymanic 属性用于计算的东西。所以我可以在JSON dic属性中循环,并使用解析器中的setObject:ForKey

使用这种方法我只需要保留属性,仍然需要一些代码,但我可以处理它。更改服务器密钥,重构属性,完成!

问题

我有一些关系对象,就像一个模型可以包含另一个模型的数组。还需要一些逻辑来处理这个问题。保持所有属性仍然可以是很多代码。

同样访问或设置不存在的属性会使应用程序崩溃。我能做些什么呢?

结论

在所有情况下,我仍然需要在某些时候知道键/属性。访问对象属性优于object:forKey,因为我将获得即时警告和错误。

我不想使用像RESTKit这样的框架,我已经为Rest做了我自己的框架,我只需要这种动态方法来拥有一套完全标准的类。

我也知道,在轮到您的时候,我没有想到更详细的解决方案的知识:)

问题

我是对的吗?根据你的经验,最好的方法是什么,我真的很想知道你以前做过什么,为什么有效,为什么好或不好。

希望你喜欢这个演示文稿;)

1 个答案:

答案 0 :(得分:2)

正如您所建议的,您的选择归结为具有硬编码的属性名称,因此您可以获得合成方法和点访问器或使用某种动态存储,并且只能通过KVC明确命名它们来访问属性。 / p>

如果您正在使用自己构建的API,我建议您标准化并记录API返回的JSON结构,这样您就不必处理转移属性名称。通过这种方式,您可以使用具有匹配的声明属性的具有良好名称和形式的对象在本地支持API。当然,根据您所概述的标准,这不是流畅的,但您获得了具有常规类型属性的所有编译器和语法优势。我敢打赌这会导致更容易的开发。

如果您的API返回一个不断变化的JSON结构(同样不推荐),那么我建议完全避开模型映射架构,只使用NSDictionary来存储响应。

我想这里的关键点是,如果你想要一个对象模型映射到你的API,那么你暗示有一些模型可以传递,如果是这种情况那么只需要创建与JSON匹配的属性,不要担心美丽/技术性。保持简单。