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