NSInvalidArgumentException [NSDictionary initWithObjects:forKeys:]:对象数 (0) 与键数 (1) 不同

Posted

技术标签:

【中文标题】NSInvalidArgumentException [NSDictionary initWithObjects:forKeys:]:对象数 (0) 与键数 (1) 不同【英文标题】:NSInvalidArgumentException [NSDictionary initWithObjects:forKeys:]: count of objects (0) differs from count of keys (1) 【发布时间】:2013-10-03 08:53:16 【问题描述】:

收到错误NSInvalidArgumentException [NSDictionary initWithObjects:forKeys:]: count of objects (0) differs from count of keys (1)。我使用以下代码

NSString *errorDesc = nil;
SBJsonParser *parser =  [[SBJsonParser alloc] init];
NSDictionary *jsonDictionary = [parser objectWithString:responseData];

paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
documentsPath = [paths objectAtIndex:0];
plistPath = [documentsPath stringByAppendingPathComponent:@"json_keys.plist"];

NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:jsonDictionary, nil] forKeys:[NSArray arrayWithObjects: @"json_keys",  nil]];
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];
if (plistData)

    [plistData writeToFile:plistPath atomically:YES];

else

    NSLog(@"Error in saveData: %@", errorDesc);
    [errorDesc release];

【问题讨论】:

[parser objectWithString:responseData] 是否返回 NSDictionary ?如果没有,那就投吧。 【参考方案1】:

从错误信息来看,这种情况下[parser objectWithString:responseData]返回nil。因此,[NSArray arrayWithObjects:jsonDictionary, nil] 创建了空数组。之后,您尝试创建NSDictionary,将空数组作为值传递,将@"json_keys" 字符串作为键传递给数组。因此,在这种情况下,错误消息非常准确。

解决这种情况取决于您要达到的目标。

jsonDictionarynil 时,您可以简单地从您的方法返回并且不做任何事情:

// ...
NSDictionary *jsonDictionary = [parser objectWithString:responseData];
if (nil == jsonDictionary) 
    return;

paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
// ...

另一种可能性是在这种情况下存储空的plistDict

NSMutableDictionary *plistDict = [NSMutableDictionary dictionaryWithCapacity:1];
if (nil != jsonDictionary) 
    [plistDict setObject:jsonDictionary forKey:@"json_keys"];

当然,您还可以找出[parser objectWithString:responseData] 返回nil 的原因并修复它。

【讨论】:

以上是关于NSInvalidArgumentException [NSDictionary initWithObjects:forKeys:]:对象数 (0) 与键数 (1) 不同的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 作为参数传递 swift