JSONModel错误地转换了' T'到' 0'在32位设备上

时间:2014-11-04 18:47:54

标签: ios boolean jsonmodel

我遇到了一个关于JSONModel以及将字符串T转换为BOOl的有趣问题。我在JSON中传递了字符串值T并需要将其转换为BOOL。

使用JSONModel,转换在64位设备上运行,正确地将T转换为1(显然这里有一些魔术)。但是,在32位设备上,T错误地转换为0.我无法弄清楚为什么会发生这种情况以及如何解决它。

我知道{32}设备会调用JSONValueTransformer BOOLFromNSString,并返回NO,但不会调用64位设备。

有没有人更了解32位/ 64位架构以及为什么会这样? 如何解决这个问题,以便在32位和64位设备上返回正确的BOOL值?

1 个答案:

答案 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];
}

这意味着,对于以下不区分大小写的值,我们需要返回YEStrueyes[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