好的,我现在开始使用iOS开发,目前使用Obj-C播放NSData。最近我使用URLSession:dataTask:didReceiveData方法使用 HTTP POST请求来获取NSData。服务器将响应包含JSON数组的JSON对象。
有趣的是,当响应数据太大时,NSLog部分将打印出来:"数据无法读取,因为它不是正确的格式" 即可。以下是功能:
-(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。
答案 0 :(得分:6)
初学者问题:在数据某些到达之前,在数据完成之前调用didReceiveData。阅读didReceiveData的文档,它解释了您需要做什么。您正在尝试解析不完整的数据。那不会奏效。
当您处理JSON数据时,您应该从不涉及任何NSString对象,除了可能记录数据。
答案 1 :(得分:2)
在我的情况下,我正在使用POST方法而不是GET。解决了我的问题。
答案 2 :(得分:1)
如果数据是josn,你可以
$ source ./for_loop4.sh
0
1
2
$ zsh ./for_loop4.sh
0
1
2
$ . ./for_loop4.sh
0
1
2
$ ./for_loop4.sh
./for_loop4.sh: 4: ./for_loop4.sh: Syntax error: Bad for loop variable
或强>
NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
,这样你就可以获得nsdictionary或nsstring数据,如果你不能自己解析它,你可以使用jsonModel tranlte来建模。
答案 3 :(得分:1)
我的json数据可能会遇到问题。您必须序列化您的json数据,如下面编写的代码
NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
如果要从数据库填充json数据,则必须使用Nsarray。 希望这会对你有所帮助。
答案 4 :(得分:1)
首先,您应该检查从API收到的响应是否是有效的JSON ,可以通过jsonlint.com等在线验证程序进行检查。如果这是一个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(Mutable)Dictionary吗?尝试像这样打印:
id response = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"json error: %@", [error localizedDescription]);
}
else
{
NSLog(@"json data : %@", response);
}