我正在尝试将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种方法有任何建议,请告诉我。
答案 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弯曲,但最小)显示了如何使用它;一些代码已过时,但总体上会得到消息。