Merge pull request #1063 from geekerzp/objc-deserialize-bool

[Objc] Fix deserialize bool value issue
This commit is contained in:
wing328 2015-08-11 10:18:52 +08:00
commit be63776162
3 changed files with 35 additions and 24 deletions

View File

@ -436,7 +436,7 @@ static void (^reachabilityChangeBlock)(int);
} }
// primitives // primitives
NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"BOOL", @"NSNumber"]; NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"NSNumber"];
if ([primitiveTypes containsObject:class]) { if ([primitiveTypes containsObject:class]) {
if ([class isEqualToString:@"NSString"]) { if ([class isEqualToString:@"NSString"]) {
@ -445,25 +445,24 @@ static void (^reachabilityChangeBlock)(int);
else if ([class isEqualToString:@"NSDate"]) { else if ([class isEqualToString:@"NSDate"]) {
return [NSDate dateWithISO8601String:data]; return [NSDate dateWithISO8601String:data];
} }
else if ([class isEqualToString:@"BOOL"]) {
// Returns YES on encountering one of "Y", "y", "T", "t", or a
// digit 1-9—the method ignores any trailing characters
// NSString => BOOL => NSNumber
return [NSNumber numberWithBool:[data boolValue]];
}
else if ([class isEqualToString:@"NSNumber"]) { else if ([class isEqualToString:@"NSNumber"]) {
// NSNumber from NSNumber // NSNumber from NSNumber
if ([data isKindOfClass:[NSNumber class]]) { if ([data isKindOfClass:[NSNumber class]]) {
return data; return data;
} }
else if ([data isKindOfClass:[NSString class]]) {
// NSNumber (NSCFBoolean) from NSString
if ([[data lowercaseString] isEqualToString:@"true"] || [[data lowercaseString] isEqualToString:@"false"]) {
return [NSNumber numberWithBool:[data boolValue]];
// NSNumber from NSString // NSNumber from NSString
else { } else {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle; formatter.numberStyle = NSNumberFormatterDecimalStyle;
return [formatter numberFromString:data]; return [formatter numberFromString:data];
} }
} }
} }
}
// model // model
Class ModelClass = NSClassFromString(class); Class ModelClass = NSClassFromString(class);

View File

@ -436,7 +436,7 @@ static void (^reachabilityChangeBlock)(int);
} }
// primitives // primitives
NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"BOOL", @"NSNumber"]; NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"NSNumber"];
if ([primitiveTypes containsObject:class]) { if ([primitiveTypes containsObject:class]) {
if ([class isEqualToString:@"NSString"]) { if ([class isEqualToString:@"NSString"]) {
@ -445,25 +445,24 @@ static void (^reachabilityChangeBlock)(int);
else if ([class isEqualToString:@"NSDate"]) { else if ([class isEqualToString:@"NSDate"]) {
return [NSDate dateWithISO8601String:data]; return [NSDate dateWithISO8601String:data];
} }
else if ([class isEqualToString:@"BOOL"]) {
// Returns YES on encountering one of "Y", "y", "T", "t", or a
// digit 1-9the method ignores any trailing characters
// NSString => BOOL => NSNumber
return [NSNumber numberWithBool:[data boolValue]];
}
else if ([class isEqualToString:@"NSNumber"]) { else if ([class isEqualToString:@"NSNumber"]) {
// NSNumber from NSNumber // NSNumber from NSNumber
if ([data isKindOfClass:[NSNumber class]]) { if ([data isKindOfClass:[NSNumber class]]) {
return data; return data;
} }
else if ([data isKindOfClass:[NSString class]]) {
// NSNumber (NSCFBoolean) from NSString
if ([[data lowercaseString] isEqualToString:@"true"] || [[data lowercaseString] isEqualToString:@"false"]) {
return [NSNumber numberWithBool:[data boolValue]];
// NSNumber from NSString // NSNumber from NSString
else { } else {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle; formatter.numberStyle = NSNumberFormatterDecimalStyle;
return [formatter numberFromString:data]; return [formatter numberFromString:data];
} }
} }
} }
}
// model // model
Class ModelClass = NSClassFromString(class); Class ModelClass = NSClassFromString(class);

View File

@ -149,4 +149,17 @@
XCTAssertTrue([result[0][0] isKindOfClass:[NSString class]]); XCTAssertTrue([result[0][0] isKindOfClass:[NSString class]]);
} }
- (void)testDeserializeBool {
NSString *data;
NSNumber *result;
data = @"true";
result = [apiClient deserialize:data class:@"NSNumber*"];
XCTAssertTrue([result isEqual:@YES]);
data = @"false";
result = [apiClient deserialize:data class:@"NSNumber*"];
XCTAssertTrue([result isEqual:@NO]);
}
@end @end