2016-08-24 50 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

相關問題