Objective-C DRY JSON映射和对象创建

时间:2011-02-11 01:29:11

标签: iphone objective-c json ios dry

我正在尝试将JSON信息动态映射到不同的对象。但我无法弄清楚如何控制整个指针的情况,因为我希望它能起作用。

到目前为止,我的方法是为每个对象创建一个字典,将变量指针映射到等效的JSON键。在我的JSON映射器中,我有一个方法parseJSONFromDictionary:withObject,它应该迭代SBJSON的JSONValue返回的字典,并将适当的值分配给给定对象中的相应变量。

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{
    for (NSString *key in dict) {
        if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) {
            start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue];
        }
    }
    return start;
}

mappings是包含变量和json键的字典,而dict是从json解析器返回的字典。

最大的问题是我无法做start.[self.mappings objectForKey:key]。我对C知之甚少,显然我对指针知之甚少,那么我将如何创建这种系统呢?我知道这不是正确的做法,但正确的方法是什么?我知道可以做到,正如RestKit所做的那样,但他们不支持OAuth,所以我很遗憾不能使用他们可爱的框架。

我之所以走这条路是因为我正在使用的API目前处于alpha阶段。我希望能够轻松适应任何未来的变化,而无需重写许多代码行。我也想开始编程DRY-ly。我知道JSON解析非常重复,我想找到一种方法来减少开销。

感谢您的帮助!


编辑:对于我的要求,似乎存在一些混乱。我需要帮助解析JSON。我已经在使用SBJSON了。我需要帮助提出请求,我已经在使用JDG's OAuthConsumer framework。我只能使用支持OAuth 2.0的框架。

我确实需要帮助弄清楚如何阻止

-(Class1 *)parseJsonForClass1:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict];
    return instance1;
}

-(Class2 *)parseJsonForClass2:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class2 *instance2 = [self mapObjectsForClass2From:outputDict];
    return instance2;
}

-(Class3 *)parseJsonForClass3:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class2 *instance3 = [self mapObjectsForClass3From:outputDict];
    return instance3;
}

-(Class1 *)mapObjectsForClass1From:(NSDictionary *)dict {
    Class1 *object1 = [[Class1 alloc] init];
    object1.name = [[dict valueForKey:@"name"] stringValue];
    object1.date = [[dict valueForKey:@"date"] stringValue];
    object1.objId = [[dict valueForKey:@"id"] intValue];

    return object1;
}

-(Class2 *)mapObjectsForClass2From:(NSDictionary *)dict {
    Class2 *object2 = [[Class2 alloc] init];
    object2.something = [[dict valueForKey:@"something"] stringValue];
    object2.title = [[dict valueForKey:@"title"] stringValue];
    object2.imageUrl = [[dict valueForKey:@"image_url"] stringValue];

    return object2;
}

-(Class3 *)mapObjectsForClass3From:(NSDictionary *)dict {
    Class3 *object3 = [[Class3 alloc] init];
    object3.foo = [[dict valueForKey:@"bar"] stringValue];
    object3.flag = [[dict valueForKey:@"is_member"] boolValue];
    object3.obj1 = [[Class1 alloc] init];
    object3.obj1 = [self mapOjectsForClass1From:[dict objectForKey:@"name1"]];

    return object3;
}

因此,如果您对如何将这些方法合并为1种方法有任何建议,请告诉我。

4 个答案:

答案 0 :(得分:6)

我知道这是一个旧线程,但想到这里,https://github.com/mystcolor/JTObjectMapping中的代码可以帮助对象映射。在使用之前,您需要准备好映射和自定义对象。 我在Google上发现了这个....虽然没有使用它。需要尝试一下。

答案 1 :(得分:5)

您可以使用KVC。为JSON字典中要插入对象的每个值创建一个setter,并使用-setValue:forKey:实际设置值,例如。

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start
{
    for (NSString *key in [dict allKeys]) 
    {
        NSString* propertyName = [[self mappings] objectForKey: key];
        [start setValue: [dict objectForKey: key] forKey: propertyName];
        // the above line will throw an exception if start does not have a set accessor for property
    }
    return start;
}

答案 2 :(得分:2)

我最近看到有人使用Objective Resources执行此操作。虽然这是访问对象的好方法,但有些实现可能会变得混乱。无论你喜欢与否,你都必须使用服务器发送给你的所有东西。我现在要远离这个。

答案 3 :(得分:0)

另请参阅HTTPRiot,它负责处理大部分通信工作,异步处理连接等。这个Tutorial about JSON communications与iOS(Ruby弯曲,但最小)显示了如何使用它;一些代码已过时,但总体上会得到消息。