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,以加快开发速度,避免网络往返,因此陷入了这种情况。是的,您发现了这个问题,建议的解决方案奏效了。