2016-08-24 64 views
0

RestKit版本:0.27.0布尔值序列化为真/假的X WWW的形式,进行了urlencoded

有什么办法如何让RestKit序列化存储在NSDictionary中的布尔值X- www-form-urlencoded参数?

我已NSDictionary的填充值,它被传播到编码串:

product=ACCOUNT&rejected=1&type=NUMBER_OF_LOGINS_MONTH 

但我需要真/假,而不是1或0作为用于被拒绝参数的值。

是否有任何方式如何使用类规范类似于RKAttributeMapping的propertyValueClass覆盖默认类型NSNumber?此外,NSNumber在内部实现为__NSCFBoolean。是否可以使用这些信息将值序列化为真/假?

回答

1

我已经子类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"; 
    } 

还记得复制的其他方法/对象和重命名否则它们在链接时会发生碰撞。

新的子类必须与RestKit登记:

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

UPDATE: 该解决方案适用于与除GET,HEAD和DELETE所有方法的请求。这些方法仍会触发原始序列化:不是true/false,而是1/0。

0

您可以将布尔NSNumber转换为字符串

NSNumber *number = @YES; 
NSString *boolString = number.boolValue ? @"true" : @"false"; 
NSLog(@"%@", boolString); 
+0

谢谢Vadian。问题是我不能以其他方式传播restkit引擎中的布尔值,而不是在NSDictionary中。同时我不想更改RK代码。请参阅我的答案http://stackoverflow.com/a/39120726/3389683 –

+0

在'NSDictionary'实例中,原始布尔值必须表示为'NSNumber',因为字典中的所有类型都必须是对象。另一种方法是使用字符串并将它们转换回服务器端的数字/布尔值。 – vadian

相关问题