我打算将iOS SDK中的NSDictionary *对象转换为NSString *。
假设我的NSDictionary对象具有以下键值对: {“aps”:{“badge”:9,“alert”:“hello”}}(注意值本身是NSDictionary对象) 我希望它转换为一个哈希映射,键值对为{“aps”:“badge:9,alert:hello”}(通知值只是一个字符串)。
我可以使用以下代码在NsDictionary中打印值:
NSDictionary *userInfo; //it is passed as an argument and contains the string I mentioned above
for (id key in userInfo)
{
NSString* value = [userInfo valueForKey:key];
funct( [value UTF9String]; // my function
}
但我无法在值对象上调用任何NSString方法,如UTT8String。它给我错误“由于未捕获的异常终止应用程序NSInvalidArgumentException:reason [_NSCFDictionary UTF8String]:无法识别的选择器发送到实例
答案 0 :(得分:1)
您将不得不以递归方式处理字典结构,这是一个您应该能够适应的示例:
-(void)processParsedObject:(id)object{
[self processParsedObject:object depth:0 parent:nil];
}
-(void)processParsedObject:(id)object depth:(int)depth parent:(id)parent{
if([object isKindOfClass:[NSDictionary class]]){
for(NSString * key in [object allKeys]){
id child = [object objectForKey:key];
[self processParsedObject:child depth:depth+1 parent:object];
}
}else if([object isKindOfClass:[NSArray class]]){
for(id child in object){
[self processParsedObject:child depth:depth+1 parent:object];
}
}
else{
//This object is not a container you might be interested in it's value
NSLog(@"Node: %@ depth: %d",[object description],depth);
}
}
答案 1 :(得分:0)
您需要将该循环应用于每个子节点,而不是主字典。你说你自己在字典里有一本字典:
for(id key in userInfo)
{
NSDictionary *subDict = [userInfo valueForKey:key];
for(id subKey in subDict)
{
NSString* value = [subDict valueForKey:subKey];
}
}
这个循环假定你在第一级有整个字典,否则你需要使用danielbeard的递归方法。
答案 2 :(得分:0)
我找到了最简单的方法。在NSDictionary对象上调用description方法给了我完全需要的东西。愚蠢到第一次就错过了它。