Invalid value around character 0, NSJSONSerialization

ƒernando Valle picture ƒernando Valle · Jul 17, 2014 · Viewed 15.1k times · Source

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": "[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_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.

Answer

GilesDMiddleton picture GilesDMiddleton · Feb 8, 2015

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];