NSJSONSerialization 无法从 URL 加载大型 json 数据

NSJSONSerialization cannot load large json data from URL

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.hrjournalmyanmar.com/test.cfm"]];

__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           json = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:0
                                                                    error:nil];
                           NSLog(@"Async JSON: %@", json);

即使 json 格式和编码正确,我也无法说服为什么我从上面收到 (null) return 消息。当json数据(字段长度)较小但字段长度又长又大时,上述编码是正确的,出现(空)错误。

您的 JSON 无效。请在JSONLint or JSON Editor

中查看

问题出在 thumb 键上,该键缺少开头 "

在你的 JSON 中是这样的:

thumb":"http: //mmjobs.mmdroid.biz/articles/articles234."

应该是这样的:

"thumb":"http: //mmjobs.mmdroid.biz/articles/articles234."

编辑:

根据您的评论。

您的 JSON 仍然无效,因为它包含很多换行符并使其无效。我使用以下方法解决了您的问题。

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.hrjournalmyanmar.com/test.cfm"]];
__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
    NSError *error = nil;
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\r\n" withString:@""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];


   if (!error)
   {
       NSLog(@"Async JSON: %@", json);
   }
   else
   {
       NSLog(@"Error: %@", error);
   }
}];

注:

我不推荐这种方法,最好在服务器端自己更改 JSON。使用错误参数,而不是将 nil 传递给它。错误对象会给你准确的错误信息。

问题是您没有在后端创建有效的 JSON 格式。如果你尝试我的代码片段,效果很好,但不是在 JSON 中创建我的数据而是 NSString.

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.hrjournalmyanmar.com/test.cfm"]];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

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

                           NSLog(@"Async JSON: %@", dataReceived);
}];