我正在评估RestKit在我的项目中使用。我创建了一个简单的应用程序,它加载一些JSON并将其映射到Objective-C对象。我在正确映射具有数字和逻辑字段的JSON对象时遇到问题。 E.g。
{
"integerValue":"5",
"booleanValue":"YES",
}
我希望这些映射到我的数据对象中的以下属性:
@property int integerValue;
@property BOOL booleanValue;
它没有开箱即用,所以我为此创建了一个值变换器:
[_activityMapping setValueTransformer:[RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class inputValueClass, __unsafe_unretained Class outputValueClass) {
if([inputValueClass isSubclassOfClass:[NSString class]] && [outputValueClass isSubclassOfClass:[NSNumber class]]) {
return YES;
}
else {
return NO;
}
} transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputClass, NSError *__autoreleasing *error) {
if([[inputValue class] isSubclassOfClass:[NSString class]] && [outputClass isSubclassOfClass:[NSNumber class]]) {
NSString *inputString = (NSString *)inputValue;
if([inputString isEqualToString:@"YES"] || [inputString isEqualToString:@"NO"]) {
*outputValue = [NSNumber numberWithBool:[inputString boolValue]];
}
else {
*outputValue = [NSNumber numberWithInt:[inputString intValue]];
}
}
else {
*outputValue = [inputValue copy];
}
return YES;
}]];
此代码有效,但看起来很难看。请注意我必须检查输入值以查看它是布尔值还是整数。关于优雅解决这个问题的任何建议?
请注意我正在使用RestKit。我知道NSJSONSerialization
并知道如何在代码中解析JSON。如果您建议使用非RestKit解决方案,请解释为什么不建议使用RestKit。
答案 0 :(得分:2)
问题不是RestKit
级别,而是JSON
级别。
根据JSON规范,布尔值应使用true/false
而不是YES/NO
来表示。如果您将JSON更新为语义正确,那么RestKit
应该做正确的事情。
答案 1 :(得分:0)
确定。所以根据我对你的答案的理解,你的主要问题在于将JSON对象中的数据映射到它们自己的指定变量。
所以,我建议使用传统的NSJSONSerialization
方法。
所以,首先。您需要将JSON object
存储在NSData
对象中。现在,您最有可能从简单的URL下载数据。所以,这就是你要做的事情:
//This part is just to download the data. If you're using another method - that's fine. Just make sure that the download is in NSData format
NSURL *url = [[NSURL alloc] initWithString : @"YOUR_URL_HERE"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL : url];
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:nil];
现在,您需要将这些映射到NSDictionary
...以下是:
//This is the actual NSJSONSerialization part.
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableLeaves
error:nil];
现在,只需将值映射到指定的属性。
_integerValue = (int)[jsonDict objectForKey:@"integerValue"];
_booleanValue = (BOOL)[jsonDict objectForKey:@"booleanValue"];