38

I'm trying to send data to a server and receive the response in JSON format. The problem is that the server has to return "success" or "fail" but it returns "(null)".

Here's the returned error:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=XXXXXXXXX {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

Is it possible that the error is in the server script?

Here's my function to send the data and receive the response:

- (void) putData:(NSString *)parameter valor:(NSString *)valor {

    NSString *rawString = [NSString stringWithFormat:@"%@=%@", parameter, valor];
    NSData *data = [rawString dataUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:@"http://www.xxx.xxx/xxx.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"PUT"];
    [request setHTTPBody:data];
    NSURLResponse *response;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSLog(@"responseData: %@ error: %@", json, error);
}
Cœur
  • 37,241
  • 25
  • 195
  • 267
iosdevrocks
  • 1,025
  • 3
  • 10
  • 17

3 Answers3

34

Unless you pass the option NSJSONReadingAllowFragments to [NSJSONSerialization JSONObjectWithData:options:error:] the response from the server must be valid JSON with a top level container which is an array or dictionary.

for example:

    { "response" : "Success" }

P.S. If you want a mutable dictionary you must also include NSJSONReadingMutableContainers in your options.

Stu
  • 356
  • 3
  • 2
  • What you're saying is that the mistake might be in the PHP code? – iosdevrocks Jan 05 '13 at 12:16
  • I is likely JSONP, so JSON, but wrapped in a method named something like callback(_all your JSON here); – RickiG Aug 07 '13 at 17:37
  • @RickiG So, If you have no control over the server's response, how would you get by this? By using NSJSONReadingAllowFragments ? If that's the case, does this automatically parse the containing JSON? How would you hanlde it as a response? Thanks! – skram Oct 05 '14 at 00:18
  • 2
    @Stu i cant solve this issue with or without NSJSONReadingAllowFragments – Ashish P Oct 13 '14 at 07:12
  • Also you should try AFHTTPResponseSerializer (instead AFJSONResponseSerializer). It works for me – Włodzimierz Woźniak Aug 18 '16 at 15:03
10

It may possible that, the response from your server doesn't contain valid JSON.

Technically, The JSON object must be start with either an "array" or an "object (dictionary)".

So, Whatever your server is returning isn't.

And, you can force the JSON to be consumed regardless by using the NSJSONReadingAllowFragments option.

by using ,

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
Vandit Mehta
  • 2,572
  • 26
  • 41
1

You can get this issue if you're connected to VPN on your iOS device.

codeburn
  • 1,994
  • 17
  • 20