NSDictionary 中的布尔值序列化为 true/false for x-www-form-urlencoded

Boolean value in the NSDictionary serialized as true/false for x-www-form-urlencoded

RestKit 版本:0.27.0

有什么办法可以让RestKit将NSDictionary中存储的boolean值序列化为x-www-form-urlencoded参数吗?

我在 NSDictionary 中填充了值,它被传播到编码字符串:

product=ACCOUNT&rejected=1&type=NUMBER_OF_LOGINS_MONTH

但我需要 true/false 而不是 1 或 0 作为被拒绝参数的值。

有什么方法可以使用类似于RKAttributeMapping的propertyValueClass的class规范来覆盖默认类型NSNumber吗?此外,NSNumber 在内部实现为 __NSCFBoolean。是否可以使用此信息将值序列化为 true/false?

您可以使用

将布尔值 NSNumber 转换为字符串
NSNumber *number = @YES;
NSString *boolString = number.boolValue ? @"true" : @"false";
NSLog(@"%@", boolString);

我已经将 RKURLEncodedSerialization 子类化并从 RKAFQueryStringFromParametersWithEncoding:

复制了实现
    static NSString * TSNRKAFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) {
        NSMutableArray *mutablePairs = [NSMutableArray array];
        for (TSNRKAFQueryStringPair *pair in TSNRKAFQueryStringPairsFromDictionary(parameters)) {

            if([NSStringFromClass([pair.value class]) isEqualToString:@"__NSCFBoolean"]) {

                pair.value = TSNNSCFBooleanToBooleanStringConvertor(pair.value);
            }

            [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]];
        }

        return [mutablePairs componentsJoinedByString:@"&"];
    }

    NSString* TSNNSCFBooleanToBooleanStringConvertor(NSNumber* booleanInNSNumber) {

        return [booleanInNSNumber boolValue] ? @"true" : @"false";
    }

另外记得复制另一个methods/objects并重命名它们,否则链接时会发生冲突。

新的子类必须在 RestKit 中注册:

[RKMIMETypeSerialization unregisterClass:[RKURLEncodedSerialization class]];
[RKMIMETypeSerialization registerClass:[TSNRKURLEncodedSerialization class] forMIMEType:RKMIMETypeFormURLEncoded];

更新: 此解决方案适用于使用除 GET、HEAD 和 DELETE 之外的所有方法的请求。这些方法仍然会触发原始序列化:不是 true/false,而是 1/0.