ios – 字符0,NSJSONSerialization周围的值无效

我从我的服务器上获取了一个有效的响应:
- (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":"[email protected]","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之前,需要检查响应.它可能会告诉你它没有找到.

此时,数据实际上可以包含404 HTML页面.

我使用这些方法来调试这个,并使用更简单的方法来处理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];

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...