Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 数据无法’;因为它是’;格式正确_Ios_Objective C_Json - Fatal编程技术网

Ios 数据无法’;因为它是’;格式正确

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

好的,我现在从iOS开发开始,目前正在使用Obj-C处理NSData。最近我使用URLSession:dataTask:didReceiveData方法使用HTTP POST request获取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。

如果数据是某种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 KB
NSLog(@“%@,[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding])的数据,请尝试一下,看看结果如何。如果数据是真正的JSON,那么它应该是可打印的。我相信这是正确的,但是要真正解决这个问题,需要一个
NSMutableData
实例变量,该变量在
didReceiveData
中追加,并在调用
didCompleteWithError
时最终解析为JSON。我尝试过这个,不是这个问题,请点击这个链接。希望它能起作用。如果你面临将swift转换为目标c到swift的问题,现在就解决了。非常感谢。在查询结束之前访问数据确实是个问题。