我从我的服务器中提取.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 /某个NSData最大长度中的编码/流氓字符有关吗?
NSData获取方法和JSON序列化方法上的那些选项,我总是留空,过去没有问题,就拉动的内容而言,它是相同的。我也尝试了没有爱的请求和会议等。
编辑: 我应该补充一点,当我记录json字典的.allKeys时,它会正确返回所有键(包括那些未包含在字典本身日志中的键)。这与正确的NSData长度相结合意味着数据实际上是完成的。解释是NSLog本身是否以某种方式被截断,暗示当不存在时出现错误。问题是我没有改变任何东西。它可能是新Xcode中的beta bug。
编辑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。
答案 0 :(得分:1)
看看你是否得到了不同的结果:
NSLog(@"json is %@", json.description);
或者完全排除NSLog,可能在那里断点代码,右键单击调试区域的变量窗格中的json,然后选择打印描述&#34; json&#34; < / p>
我的经验是NSJSONSerialization将为格式错误的JSON返回错误。
答案 1 :(得分:1)
这似乎是Xcode本身的一些愚蠢特征。此定义适用于完整的NSLog:
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
从这里采取:
NSLog on devices in iOS 10 / Xcode 8 seems to truncate? Why?
有多少开发人员会花时间在懒惰的记录器中寻找想象中的错误...
对于那些后来的人,我正在运行Xcode 9.0。