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.
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.