Parsing JSON with NSJSONSerialization: Error 3840 - Data Corrupted?

≡放荡痞女 提交于 2019-12-10 09:46:40

问题


I've read many Q/As on this problem but couldn't find an answer that fits my situation.

I retrieve a JSON response from a REST service I've created in PHP. This is my code:

NSURLResponse *response = nil;
NSError *theError1 = nil;
NSError *theError2 = nil;

NSURL *webServiceUrl = [NSURL URLWithString:@"http://..."];
NSURLRequest *request = [NSURLRequest requestWithURL:webServiceUrl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
NSData *theData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&theError1];

NSString *dataString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
NSLog(@"%@", dataString);

id json = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers error:&theError2];
if (theError2 != nil)
    NSLog(@"%@", theError2);

When I invoke the REST call in the browser, I see the following response, which seems identical to what XCode logs:

{
  "Name": "REST Service",
  "Product": "REST Test",
  "Version": "1.0.0.0",
  "Copyright": "2013 Test Company"
}

When I execute above code, however, the following error is created and logged:

Error Domain=NSCocoaErrorDomain Code=3840 "The data couldn’t be read because it has been corrupted." (Invalid value around character 3.) UserInfo=0x100547430 {NSDebugDescription=Invalid value around character 3.}

What am I doing wrong?


回答1:


OK, as always, checking the actual data instead of the string representation pays - thanks @Bavarious.

It turns out that the PHP script(s) in charge of creating the JSON were all "UTF8 with BOM", so PHP returned a BOM for every script involved.

Once I changed all the PHP files to "UTF8 without BOM" everything seems to be fine - need to test this on the MAC though.

Sorry to interrupt, keep up the good work.

(@Bavarious: If you'd like to write an answer, I'd be happy to upvote and accept it, as you pointed me to the solution).


Was able to parse the JSON now as expected. Making a mental note to always double-check the text file encoding.




回答2:


    NSURL *theURL = [NSURL URLWithString:@"http://yourdataurl"];

    NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
                       completionHandler:^(NSURLResponse *response,     NSData *data, NSError *connectionError) {
                               if (!connectionError) {
                                   NSError *error;

                                   NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                                   NSData *theData = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

                                   NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:theData options:0 error:&error];


                                   if (!jsonResponse || error)
                                   {
                                       NSLog(@"Error");
                                   }
                                   else
                                   {
                                       // Everything is ok..
                                   }
                               }
                           }];


来源:https://stackoverflow.com/questions/18585380/parsing-json-with-nsjsonserialization-error-3840-data-corrupted

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!