Ios 数据无法’;因为它是’;格式正确
好的,我现在从iOS开发开始,目前正在使用Obj-C处理NSData。最近我使用URLSession:dataTask:didReceiveData方法使用HTTP POST request获取NSData。服务器将响应包含JSON数组的JSON对象 有趣的是,当响应数据太大时,NSLog部分会打印出来:“无法读取数据,因为它的格式不正确”。功能如下:Ios 数据无法’;因为它是’;格式正确,ios,objective-c,json,Ios,Objective C,Json,好的,我现在从iOS开发开始,目前正在使用Obj-C处理NSData。最近我使用URLSession:dataTask:didReceiveData方法使用HTTP POST request获取NSData。服务器将响应包含JSON数组的JSON对象 有趣的是,当响应数据太大时,NSLog部分会打印出来:“无法读取数据,因为它的格式不正确”。功能如下: -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
NSError *error;
// get data from NSData into NSDict
NSDictionary *searchData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSArray *test = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSMutableDictionary *mdict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"what: %@", mdict);
NSLog(@"received data length: %@", [NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);
if (error) {
NSLog(@"json error: %@", [error localizedDescription]);
}
}
只是想知道是否有人知道导致这个问题的潜在原因
[更新]
解决这个问题的另一种方法可能是使用NSString进行数据存储。但我必须自己解析它。不过我更喜欢使用NSDictionary。如果数据是某种josn,您可以
NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
或
[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding])
,这样您将获得nsdictionary或nsstring数据,如果您自己无法解析它,您可以使用jsonModel tranlte to model。您的json数据可能有问题,我也遇到过同样的问题。您必须序列化json数据,如下所示
NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
如果要从数据库填充json数据,则必须使用Nsarray。
希望这能对您有所帮助。首先,您应该检查从API收到的响应是否是有效的JSON,是否可以通过在线验证程序进行检查,如。如果这是一个vaid json,那么您就可以开始了 此外,当您得到
error
对象时,应在每个步骤上对其进行评估,以查看哪些数据解析会导致此问题,如:
NSError *error;
// get data from NSData into NSDict
NSDictionary *searchData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"json error: %@", [error localizedDescription]);
}
NSArray *test = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSMutableDictionary *mdict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"what: %@", mdict);
NSLog(@"received data length: %@", [NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);
if (error) {
NSLog(@"json error: %@", [error localizedDescription]);
}
此外,正如你所说:
服务器将响应包含JSON数组的JSON对象
您确定它正在返回NS(可变)字典吗??尝试按如下方式打印:
id response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"json error: %@", [error localizedDescription]);
}
else
{
NSLog(@"json data : %@", response);
}
初学者问题:当一些数据到达时,在数据完成之前调用didReceiveData。阅读didReceiveData的文档,其中解释了您需要执行的操作。您正在尝试分析不完整的数据。那不行
在处理JSON数据时,除了可能记录数据外,不应涉及任何NSString对象 在我的例子中,我使用的是POST方法,而不是GET方法。解决了我的问题。您是如何确定数据太大的?有多大太大?我调用了
[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatter CountStyleFile])代码>函数以KB为单位计算长度。它告诉了您什么?当数据约为200字节时,我可以将其正确存储在NSDictionary中;但不幸的是,对于具有21 KBNSLog(@“%@,[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding])的数据,请尝试一下,看看结果如何。如果数据是真正的JSON,那么它应该是可打印的。我相信这是正确的,但是要真正解决这个问题,需要一个NSMutableData
实例变量,该变量在didReceiveData
中追加,并在调用didCompleteWithError
时最终解析为JSON。我尝试过这个,不是这个问题,请点击这个链接。希望它能起作用。如果你面临将swift转换为目标c到swift的问题,现在就解决了。非常感谢。在查询结束之前访问数据确实是个问题。