我遇到了一个关于JSONModel以及将字符串T转换为BOOl
的有趣问题。我在JSON中传递了字符串值T并需要将其转换为BOOL。
使用JSONModel,转换在64位设备上运行,正确地将T转换为1(显然这里有一些魔术)。但是,在32位设备上,T错误地转换为0.我无法弄清楚为什么会发生这种情况以及如何解决它。
我知道{32}设备会调用JSONValueTransformer
BOOLFromNSString
,并返回NO,但不会调用64位设备。
有没有人更了解32位/ 64位架构以及为什么会这样? 如何解决这个问题,以便在32位和64位设备上返回正确的BOOL值?
答案 0 :(得分:1)
在您链接的项目中,BOOLFromNSString
方法如下:
-(NSNumber*)BOOLFromNSString:(NSString*)string
{
if (string != nil &&
([string caseInsensitiveCompare:@"true"] == NSOrderedSame ||
[string caseInsensitiveCompare:@"yes"] == NSOrderedSame)) {
return [NSNumber numberWithBool:YES];
}
return [NSNumber numberWithBool: ([string intValue]==0)?NO:YES];
}
这意味着,对于以下不区分大小写的值,我们需要返回YES
:true
,yes
,[any number that isn't 0]
。
它在任何平台上为YES
返回T
这一事实是不可思议的,而不是"正确"。您应该使用其中一个期望值。
编辑:您的子类:
#import "JSONModelTransformations/JSONValueTransformer.h"
@interface MyParser : JSONValueTransformer
@end
@implementation MyParser
- (NSNumber *)BOOLFromNSString:(NSString *)string {
if (string != nil && [string caseInsensitiveCompare:@"t"] == NSOrderedSame) {
return [NSNumber numberWithBool:YES];
}
return [super BOOLFromNSString:string];
}
@end