布尔值序列化为真/假的X WWW的形式,进行了urlencoded
问题描述:
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。是否可以使用这些信息将值序列化为真/假?
答
我已经子类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。
答
您可以将布尔NSNumber
转换为字符串
NSNumber *number = @YES;
NSString *boolString = number.boolValue ? @"true" : @"false";
NSLog(@"%@", boolString);
谢谢Vadian。问题是我不能以其他方式传播restkit引擎中的布尔值,而不是在NSDictionary中。同时我不想更改RK代码。请参阅我的答案http://stackoverflow.com/a/39120726/3389683 –
在'NSDictionary'实例中,原始布尔值必须表示为'NSNumber',因为字典中的所有类型都必须是对象。另一种方法是使用字符串并将它们转换回服务器端的数字/布尔值。 – vadian