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 的类规范来覆盖默认类型 NSNumber? NSNumber 在内部也被实现为 __NSCFBoolean。是否可以使用此信息将值序列化为 true/false?
最佳答案
我对 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];
更新: 此解决方案适用于使用除 GET、HEAD 和 DELETE 之外的所有方法的请求。这些方法仍然触发原始序列化:不是 true/false,而是 1/0。
关于ios - NSDictionary 中的 boolean 值对于 x-www-form-urlencoded 序列化为 true/false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39118868/