问题
I make a get from my server and I get a valid response:
- (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];
}
}
}
The response is like:
[{"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_estado":"1",
"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"}]
It throws me the error:
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.}
I tried with other library (CJSON) and it throw me the error:
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}
My server is a REST server and for my Android aplication works well.
_SOLVED_
Thanks to @Himanshu Joshi:
Why are you parsing the data in didReceiveData:? Data is not downloaded completely there, you have to append the data there. Parse the data in connectionDidFinishLoading: delegate method –
I parsed the data in connectionDidFinishLoading:
and everything go fine.
回答1:
I experienced the same issue, but it was because my initial URL was not correct.
The response needs to be checked before you parse the JSON. It could be telling you that it wasn't found.
At that point the data actually can contain a 404 HTML page.
I use these methods to debug this, and simpler methods to process the web request:
// 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];
回答2:
Your JSON has white space before the data:
[{"id":"37",
Check your server.
来源:https://stackoverflow.com/questions/24801883/invalid-value-around-character-0-nsjsonserialization