使用 AFNetworking 2.0 异常解析 JSON
Posted
技术标签:
【中文标题】使用 AFNetworking 2.0 异常解析 JSON【英文标题】:Parsing JSON using AFNetworking 2.0 exception 【发布时间】:2014-07-15 11:43:30 【问题描述】:我在使用 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】:您将响应解析器设置为AFHTTPResponseSerializer
而不是AFJSONResponseSerializer
。所以响应永远不会解析为 JSON。
所以改变
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
到
manager.responseSerializer = [AFJSONResponseSerializer serializer];
正如您在评论中提到的,服务器正在传递内容text/html
,如果可能,服务器应该说内容是操作类型application/json
、text/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 Code=-1016“请求失败:不可接受的内容类型: text/html" UserInfo=0x10d924d10 com.alamofire.serialization.response.error.response=text/html
发送到应用程序,这是不正确的,如果可能,应在服务器上将其更改为 application/json
、text/json
或 text/javascript
有什么办法可以从我这边处理吗?
好吧,如果您的服务器现在已经完成,也就是发送一些 500 服务器错误页面,JSON 解析将尝试解析它。不是真正的问题,但只是不需要,以后可能会遇到一些困难。
值得注意的是AFHTTPRequestOperationManager
上的默认responseSerializer
是AFJSONResponseSerializer
的一个实例以上是关于使用 AFNetworking 2.0 异常解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 解析的数据未显示在表格视图中
使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager