RestKit:映射BOOL和整数值

时间:2014-01-02 21:35:54

标签: objective-c restkit restkit-0.20

我正在评估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。

2 个答案:

答案 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"];