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

时间:2015-01-01 10:09:17

标签: ios json xcode

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

我无法说服为什么我从上面得到(null)返回消息甚至json格式并且编码是正确的。当json数据(字段长度)很小但字段长度很长且发生(空)错误时,上面的编码是正确的。

2 个答案:

答案 0 :(得分:2)

您的JSON无效。请在JSONLintJSON 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本身。使用error参数,而不是将nil传递给它。错误对象将为您提供确切的错误消息。

答案 1 :(得分:0)

问题是您没有在后端创建有效的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);
}];