valueForKeyPath的奇怪问题:@"@“最大总步数”;,这是iOS平台代码中的错误吗?
我花了几个小时调试这个问题,并因此发布了这个,以防你有专家的建议/线索 以下是出现问题的代码:valueForKeyPath的奇怪问题:@"@“最大总步数”;,这是iOS平台代码中的错误吗?,ios,iphone,json,Ios,Iphone,Json,我花了几个小时调试这个问题,并因此发布了这个,以防你有专家的建议/线索 以下是出现问题的代码: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"plot" ofType:@"json"]; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath]; NSInteger minSteps = [dict[@"steps"] value
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"plot" ofType:@"json"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSInteger minSteps = [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
NSInteger maxSteps = [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
NSLog(@"Min Steps = %@", minSteps);
NSLog(@"Max Steps = %@", maxSteps);
下面提供的JSON内容,上述代码预计将生成minSteps为“0”(zero),而maxSteps为“710”
然而,上面的代码产生了以下结果
最小步长=0
最大步长=90
为什么发现最大值为“90”?
非常感谢您提供任何线索?
plot.json文件的内容:
{
steps = (
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 75;
},
{
totalSteps = 184;
},
{
totalSteps = 113;
},
{
totalSteps = 90;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 11;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 386;
},
{
totalSteps = 282;
},
{
totalSteps = 22;
},
{
totalSteps = 42;
},
{
totalSteps = 710;
},
{
totalSteps = 200;
},
{
totalSteps = 0;
},
{
totalSteps = 111;
},
{
totalSteps = 12;
},
{
totalSteps = 0;
},
{
totalSteps = 49;
},
{
totalSteps = 67;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 104;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 55;
}
);
}
为每个请求提供调试器输出:
PS:很抱歉JSON的长度有重复,因为这接近于实时数据
(lldb) po dict
{
steps = (
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 75;
},
{
totalSteps = 184;
},
{
totalSteps = 113;
},
{
totalSteps = 90;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 11;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 386;
},
{
totalSteps = 282;
},
{
totalSteps = 22;
},
{
totalSteps = 42;
},
{
totalSteps = 710;
},
{
totalSteps = 200;
},
{
totalSteps = 0;
},
{
totalSteps = 111;
},
{
totalSteps = 12;
},
{
totalSteps = 0;
},
{
totalSteps = 49;
},
{
totalSteps = 67;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 104;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 0;
},
{
totalSteps = 55;
}
);
}
(lldb) po [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
0
(lldb) po [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
90
(lldb) po minSteps
0
(lldb) po maxSteps
90
(lldb)
@马特,再次感谢你。我还找到了行之有效的解决方案:
为了其他的好处,我提供了运行良好的代码
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"plot" ofType:@"json"];
NSError *jsonParsingError = nil;
NSMutableDictionary *responseObject = [NSJSONSerialization
JSONObjectWithData:[NSData dataWithContentsOfFile:filePath]
options:NSJSONReadingMutableContainers error:&jsonParsingError];
NSInteger minSteps = [dict[@"steps"] valueForKeyPath:@"@min.totalSteps"];
NSInteger maxSteps = [dict[@"steps"] valueForKeyPath:@"@max.totalSteps"];
NSLog(@"Min Steps = %@", minSteps);
NSLog(@"Max Steps = %@", maxSteps);
然而,请注意,只要JSON结构也不太正确,只需要很少的修改,就可以被NSJSONSerialization解析器接受
以下是可接受格式的修改文件:
{
“steps” : (
{
“totalSteps” : 0,
},
...
如果您看到这样的问题:
(lldb) po jsonParsingError
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (No string key for value in object around character 6.) UserInfo=0x109875d50 {NSDebugDescription=No string key for value in object around character 6.}
请检查JSON格式的有效性。并确保您的文件不是RTF格式,等等。这是因为当您的文件转换为字典时,
steps
将作为字典数组结束,其中totalSteps
是键,值是字符串。从字符串的角度来看,“90”
是最大的(因为它以字母“9”
开头,在“字母表”中比任何其他数字都要晚;数字作为字符从“0”
到“9”
)
原因是,您正在以.plist的形式读取文件,而不是以JSON的形式读取<代码>[NSDictionary dictionaryWithContentsOfFile:filePath]将文件解释为.plist。如果希望将其解释为JSON,请将其作为NSData读取,然后使用JSON方法(NSJSONSerialization)将其转换为Cocoa对象
不能仅仅因为文件名以“JSON”结尾就将其读取为JSON
dictionaryWithContentsOfFile:
只做一件事:它将文件读取为.plist
。您的文件只是放在门口,因为它可以理解为“旧式属性列表”:请参阅。旧式属性列表中没有数字;只有字符串。在某种程度上,你是不幸的;如果尝试将文件作为属性列表读取失败,对您来说会更好!但不幸的是,NSDictionary能够将其解释为旧式属性列表。JSON是不相关的,因为它不是valueForKeyPath
要发送到的对象。您需要登录(并向我们展示)dict
@matt,感谢您的快速评论,dict是从json文件创建的NSDictionary。无论如何,我提供调试器是为了清晰。有趣,让我检查一下。+1非常有意义,这就是为什么当从云(API)收到的响应运行良好时,它运行良好的原因。我当时正在处理核心图,希望使用本地JSON,以加快开发速度,避免网络往返,因此陷入了这种情况。是的,您发现了这个问题,建议的解决方案奏效了。