我从我的服务器上获取了一个有效的响应:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // Append the new data to the instance variable you declared //[_responseData appendData:data]; NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",responseBody); if(data != NULL) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL),^(void) { NSError *error = nil; //NSMutableArray *jsonArray = [[CJSONDeserializer deserializer] deserializeAsArray:[responseBody dataUsingEncoding:NSUTF8StringEncoding] error:&error]; NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; if (error) { NSLog(@"JSONObjectWithData error: %@",error); [delegate onErrorGetArrayFromServer]; } else [self parseJSON:jsonArray]; }); } else { if([delegate respondsToSelector:@selector(onErrorGetArrayFromServer)]) { [delegate onErrorGetArrayFromServer]; } } }
回复如下:
[{"id":"37","id_estado":"1","id_categoria":"1","nombre":"fer","email":"asd@gmail.com","fecha":"2014-07-16 11:25:00","observaciones":"as dasd asdasd sasd","latitud":"37.619636","longitud":"-4.318449","foto":"images\/default.jpg"},{"id":"36","id_categoria":"6","nombre":"Fernando","email":"","fecha":"2014-07-16 10:32:45","observaciones":"que","latitud":"37.6178690439634","longitud":"-4.3238141387701","foto":"images\/default.jpg"}]
它抛出了我的错误:
JSONObjectWithData error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x9e0f610 {NSDebugDescription=Invalid value around character 0.}
我尝试了其他库(CJSON),它给我发错误:
JSONObjectWithData error: Error Domain=kJSONScannerErrorDomain Code=-202 "Could not scan array. Could not scan a value." UserInfo=0xa15c0e0 {snippet=!HERE>![{"id":"37","id_esta,location=0,NSLocalizedDescription=Could not scan array. Could not scan a value.,character=0,line=0}
我的服务器是一个REST服务器,我的Android应用程序运行良好.
_解决了_
感谢@Himanshu Joshi:
为什么要在didReceiveData中解析数据?数据未完全下载,您必须在那里附加数据.解析connectionDidFinishLoading中的数据:委托方法 –
我解析了connectionDidFinishLoading中的数据:一切都很顺利.
解决方法
我遇到了同样的问题,但这是因为我的初始网址不正确.
在解析JSON之前,需要检查响应.它可能会告诉你它没有找到.
我使用这些方法来调试这个,并使用更简单的方法来处理Web请求:
// Asynchronous fetch the JSON and call the block when done NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler: ^(NSData *data,NSURLResponse *response,NSError *error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; if ([httpResponse statusCode]!=200) { // log [response description] // log [NSString stringWithUTF8String:[data bytes]] return; } NSDictionary* jsonDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; if (!jsonDic) { return; } // process the JSON }]; [downloadTask resume];