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

Mis*_*Moo 6 iphone json dry objective-c ios

我试图将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;
}
Run Code Online (Sandbox Code Playgroud)

mappings是包含变量和json键的字典,它dict是从json解析器返回的内容.

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

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

感谢您的帮助!


编辑:似乎对我要问的内容存在一些困惑.我并不需要帮助解析JSON.我已经在使用SBJSON了.我也不需要别人帮助的请求,我已经使用JDG的OAuthConsumer框架.我只能使用支持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;
}
Run Code Online (Sandbox Code Playgroud)

如果您对如何将这些方法组合成1种方法有任何建议,请告诉我.

ano*_*eal 6

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


Jer*_*myP 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;
}
Run Code Online (Sandbox Code Playgroud)


Mis*_*Moo 2

事实上,我最近看到有人使用Objective Resources来做这件事。虽然这是访问对象的好方法,但某些实现可能会变得混乱。而且无论您喜欢与否,您都必须使用服务器发送给您的所有内容。我现在要远离这个。