ios - NSDictionary 中的 boolean 值对于 x-www-form-urlencoded 序列化为 true/false

标签 ios parameters boolean nsdictionary restkit

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/

相关文章:

c# - 在 Lambda 表达式中使用三元运算符

ios - UITableViewCell 中的 UITextView,如何在 tableView 滚动时退出 textview 的 firstResponder?

IOS 在 facebook 上发布带有建议文本的照片

ios - 如何重置 CoreData 应用程序

javascript - 如何将函数的参数作为数字而不是 "NaN"进行交互/输出?

c++ - 如何将表达式作为参数/参数传递?

html - Angular,当一个元素为真时如何使其他元素为假

ios - 缩小/放大或移动到 ios 中的其他位置时停止集中用户位置

c++ - 可变参数模板包扩展

java - 有什么捷径可以获取 boolean 数组的绝对值吗?