当前位置: 首页 > 知识库问答 >
问题:

服务器拉入后JSON或NSDATA不完整/被截断[重复]

公冶谦
2023-03-14

我正在从服务器中提取一个.json文件,并试图将其读入应用程序中的NSDictionary。部分文件被正确解析,但不完整-仅读取部分文件。

奇怪的是,NSData的长度与实际文件的长度相等,所以它似乎具有完全访问权限,至少在某些阶段是这样的。然而,当我记录NSData时,对于文件的大小来说,它似乎太短了。

这是我用来查找错误的代码:

//SYNC BOOL
if (isSyncing){ return; }
isSyncing = true;

//FETCH BOOTSTRAP
NSError * fetchError = nil;
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:syncPath]
                                      options:kNilOptions
                                        error:&fetchError];
if (fetchError){   [self error]; return; }

//PARSE JSON
NSError * jsonError = nil;
NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data
                                                      options:kNilOptions
                                                        error:&jsonError];
if (jsonError){ [self error]; return; }


NSLog(@"data length is %lu", data.length);
NSLog(@"json is %@", json);

我尝试了从服务器远程加载和从NSBundle本地加载-结果相同。

这可能与JSON / some NSData max length中的编码/流氓字符有关吗?

关于NSData fetch方法和JSON Serialisation方法的那些选项,我过去一直留为空白,没有任何问题,就正在提取的内容而言,它们是相同的。我也试过请求和会议等没有爱。

编辑:我应该补充一点,当我记录json字典的.allKeys时,它会正确返回所有键(包括字典本身日志中未包含的键)。再加上正确的NSData长度,这意味着数据实际上已经完成。可以这样解释,如果NSLog本身以某种方式被截断,则意味着在不存在NSLog时出现错误。问题是我在那里什么都没有改变。这可能是新Xcode中的测试错误。

编辑B:Xcode 9上的记录器错误?

NSString * string = @"";
for (int n = 0; n < 10000; n++){
    string = [NSString stringWithFormat:@"%@ %i",string,n];
}
NSLog(@"string is %@", string);

输出到 6.7k 而不是 10k。

共有2个答案

何德寿
2023-03-14

这似乎是Xcode本身的一些愚蠢的特性。此定义适用于完整的NSLog:

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

摘自此处:

iOS10/Xcode 8设备上的NSLog似乎会截断?为什么?

有多少开发人员会花时间在懒惰记录器中寻找虚构的错误……

对于之后的人,我正在运行Xcode 9.0。

敖毅
2023-03-14

查看您是否通过以下方式获得不同的结果:

NSLog(@"json is %@", json.description);

或者要完全排除NSLog,也许可以断点那里的代码,然后在调试区域的变量窗格中右键单击json,然后选择“打印”json“的描述

我的经验是,对于格式错误的JSON,NSJSONSerialization将返回一个错误。

 类似资料:
  • 问题内容: 我正在使用以下命令将NSDictionaries数组转换为JSON数据… 创建我的数据… 然后像这样发送… 这会将NSData发送到我的服务器,但是我该如何在php中使用它…如果我从我的服务器上打印它,它实际上只是一堆随机数,并且我尝试使用json_encode,但是我认为那并不意味着原始数据… 任何帮助将是巨大的! 编辑:这是PHP的响应… 这是对Xcode中NSLoging的响应…

  • 问题内容: 以下GO程序给出了错误: 程序: 为什么我不能使用in类型? 问题答案: 更换 通过 引用规范: 当表达式或赋值中混合了不同的数字类型时,需要进行转换。例如,即使int32和int在特定体系结构上可能具有相同的大小,它们也不是同一类型。 Go使用静态类型输入,不会自动在数字类型之间转换。原因可能是为了避免某些错误。例如,应该产生什么值和什么类型?结果应该是吗? ? ?在Go中,这不是问

  • 问题内容: 我正在尝试使用后台服务拍摄屏幕截图。该服务就像一个Facebook聊天头,但是我希望它在单击时拍摄屏幕截图。 预览图片 我已经开发了一些代码,但是没有用。我尝试过的最后一个是: 但是正在将屏幕截图带到我的按钮而不是屏幕上。 我知道问题在这里: 但我不知道如何解决。谁能帮我? 我实际上正在使用Android Studio 2.2.2和Android 4.0或更高版本。 问题答案: 对于L

  • This chapter is principally a lengthy illustration of the HTTP chapter, building a complete Web server in Go. It also shows how to use templates in order to use expressions in text files to insert var

  • 我有一个后台服务,每天下午1点打电话给我。下午1点,我的Firebase数据库中的3个值应设置为0。当用户启动某个活动时,会触发后台服务。如我所愿,值在下午1点重置为0,但每次下午1点后,当用户启动活动时,服务都会运行重置我的值。如何在下午1点将值重置为0,直到第二天下午1点才再次重置? 下面是我在服务类中的代码 这是启动服务的代码。此方法在此活动的oncreate方法中调用。

  • 我正在使用BigDecimal在我的应用程序中处理正数,我想让它在第4个之后截断小数。我似乎几乎找到了我想要的RoundingMode。向下,但当BigDecimal是从双精度创建时存在一些问题。 例如: 但是,以下打印的是123.1110,这根本不是我想要的: