如果值仅包含数字,AFNetworking 不会返回 NSString

Posted

技术标签:

【中文标题】如果值仅包含数字,AFNetworking 不会返回 NSString【英文标题】:AFNetworking does not returns NSString if the value is contains only digits 【发布时间】:2012-10-10 10:13:34 【问题描述】:

我正在尝试使用 AFNetworking 在 json 中接收某个值。该值仅包含数字,我想将其作为 NSString 接收。当我比较接收到的值时,我得到了一个异常(这个帖子后面也提到了这个异常)

这是产生错误的编码。

 NSArray *overallGameResultsArray = [resultDictionary valueForKey:@"overall_game_results"];
        winCountDictionary = [[NSDictionary alloc] init];
        for (NSDictionary *gameResultsDictionary in overallGameResultsArray)
        
            NSString *userId = [gameResultsDictionary valueForKey:@"winner_user_id"];
            NSString *winCount = [gameResultsDictionary valueForKey:@"win_count"];

            if ([winCount isEqualToString:@"0"])
            
                NSLog(@"0 wins");
            

         

如果“如果比较”被评论,我不会得到例外。 win_count 仅由 JSON 响应中的数字组成。

以下是我得到的异常错误。

2012-10-10 15:41:35.086 FMB[3549:c07] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0 2012-10-10 15:41:35.086 FMB[3549:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0'
*** First throw call stack: (0x1638012 0x1345e7e 0x16c34bd 0x1627bbc 0x162794e 0x11e03 0x20583 0x1fab4 0x245053f 0x2462014 0x24527d5 0x15deaf5 0x15ddf44 0x15dde1b 0x26997e3 0x2699668 0x28d65c 0x2512 0x2445) libc++abi.dylib: terminate called throwing an exception

【问题讨论】:

我怀疑问题出在您收到的 JSON 或您正在发出的请求上。如果没有这些详细信息,就无法回答您的问题。 【参考方案1】:

我认为你必须这样做:

NSString *winCount=[NSString stringWithFormat:@"%d",[[gameResultsDictionary valueForKey:@"win_count"]intValue];

这样,你就可以将数值输入到 winCount NSString 中,然后就可以使用 isEqualToString 方法了

【讨论】:

【参考方案2】:

我想你使用 JSON。然后对象的类型由 JSON 编码决定。如果周围有",它就是一个字符串。如果它是一个数字并且你想要字符串,请更改数据在服务器上的编码方式。

但是,在这种情况下,使用数字更有意义。您应该通过以下方式更改实现。

NSNumber* winCount = [gameResultsDictionary valueForKey:@"win_count"];

if ([winCount intValue] == 0)  //this would actually work for both NSNumber and NSString
    NSLog(@"0 wins");

使用字符串比较来比较数字总是暗示你做错了。

【讨论】:

为什么这个答案的点赞数这么少??这是唯一的正确答案。为什么要将两个数字转换为字符串进行比较?【参考方案3】:

抛出异常是因为您期望一个对象是NSString,但实际上是NSNumber,因此您尝试在NSNumber 上调用isEqualToString:实现方法。

既然您知道winCount 始终是一个数字,并且显然AFNetworking 使用的JSON 反序列化器将响应中的数字装箱到NSNumber 对象中,您可以轻松地从对象中获取一个字符串,如下所示:

NSString *winCount = [[gameResultsDictionary valueForKey:@"win_count"] stringValue];

现在你有一个数字的字符串表示,你可以为此执行isEqualToString:

另请注意,更优雅的解决方案可能是将您的对象接收为ids,找到它们的类并根据确定的类进行比较。

【讨论】:

以上是关于如果值仅包含数字,AFNetworking 不会返回 NSString的主要内容,如果未能解决你的问题,请参考以下文章

如果一个列值仅与另一列中的一个值相关联,则过滤掉行

MySQL - 选择列值仅为0的行,按另一列分组?

AFNetworking 下载的文件丢失

不显示仅包含数字的 iOS 推送通知

AFNetworking 包含标头

AFNetworking 2.0 将 NSURLSessionDataTask 转换为 NSURLSessionDownloadTask 不会将所有文件数据写入磁盘