使用AFNetworking 2.0解析JSON时出现异常

5

我遇到了一个使用AFNetworking处理JSON解析数据的问题。

以下是我的代码:

        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        NSDictionary *parameters = @{@"strEmail": _logInEmail.text, @"strPassword":_logInPassword.text};
        [manager POST:@"http://carefid.com/api/user/login.php" parameters:parameters success:^

          (AFHTTPRequestOperation *operation, id responseObject) {


//NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
              NSString *str = responseObject[@"error"];
            NSLog(@"JSON: %@", str);
            UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"rootController"];
            [self presentViewController:myController animated:YES completion:nil];

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];

当我尝试记录该值时,出现以下错误:

2014-07-15 14:39:08.438 carefid[7858:60b] -[_NSInlineData objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1094c67a0
2014-07-15 14:39:08.441 carefid[7858:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSInlineData objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1094c67a0'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000101d48495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001019c399e objc_exception_throw + 43
    2   CoreFoundation                      0x0000000101dd965d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x0000000101d39d8d ___forwarding___ + 973
    4   CoreFoundation                      0x0000000101d39938 _CF_forwarding_prep_0 + 120
    5   carefid                             0x000000010001f14f __34-[ViewController existingUserBtn:]_block_invoke + 95
    6   carefid                             0x0000000100015648 __64-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke46 + 40
    7   libdispatch.dylib                   0x0000000102669851 _dispatch_call_block_and_release + 12
    8   libdispatch.dylib                   0x000000010267c72d _dispatch_client_callout + 8
    9   libdispatch.dylib                   0x000000010266c3fc _dispatch_main_queue_callback_4CF + 354
    10  CoreFoundation                      0x0000000101da6289 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    11  CoreFoundation                      0x0000000101cf3854 __CFRunLoopRun + 1764
    12  CoreFoundation                      0x0000000101cf2d83 CFRunLoopRunSpecific + 467
    13  GraphicsServices                    0x00000001040bef04 GSEventRunModal + 161
    14  UIKit                               0x0000000100570e33 UIApplicationMain + 1010
    15  carefid                             0x0000000100049183 main + 115
    16  libdyld.dylib                       0x00000001028cd5fd start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

这个问题可能是由于responseObject不是一个字典类型引起的。 如果我的代码有误,我应该如何处理呢?

1个回答

19

您正在将响应解析器设置为AFHTTPResponseSerializer而不是AFJSONResponseSerializer。因此,响应从未被解析为JSON。

所以请更改

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

转换为

manager.responseSerializer = [AFJSONResponseSerializer serializer];

如您在评论中提到的,服务器正在传输内容text/html。如果可能,服务器应该声明内容为application/jsontext/json或者text/javascript类型。

如果无法更改服务器的内容类型,您可以告诉AFJSONResponseSerializer接受text/html,例如:

AFJSONResponseSerializer *jsonReponseSerializer = [AFJSONResponseSerializer serializer]; 
// This will make the AFJSONResponseSerializer accept any content type
jsonReponseSerializer.acceptableContentTypes = nil;
manager.responseSerializer = jsonReponseSerializer;

2014年07月15日15:26:19.765 carefid[8036:60b] 错误:错误域=com.alamofire.error.serialization.response,代码=-1016,“请求失败:不可接受的内容类型:text/html” UserInfo=0x10d924d10 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x10d929b60>}现在我得到了这个错误... - OshriALM
您的服务器将JSON内容作为text/html发送到应用程序,这是不正确的,如果可能的话,应在服务器上更改为application/jsontext/jsontext/javascript - rckoenes
有没有任何方法我可以从我的一方面来处理它? - OshriALM
1
如果您的服务器现在已经完成,即发送了一些500服务器错误页面,则JSON解析器将尝试解析它。这并不是真正的问题,但是没有必要,并且以后可能会带来一些困难。 - rckoenes
1
值得注意的是,AFHTTPRequestOperationManager 上默认的 responseSerializerAFJSONResponseSerializer 的一个实例。 - David Snabel-Caunt
@OshriALM 我现在也遇到了同样的问题。有人找到解决方法了吗?我很好奇是什么导致了Http响应的未识别选择器响应。 - Logesh vijayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接