[iOS] [objC]无法将NSDictionary中的值转换为NSString

时间:2012-04-19 05:51:38

标签: ios nsstring nsdictionary

我打算将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]:无法识别的选择器发送到实例

3 个答案:

答案 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方法给了我完全需要的东西。愚蠢到第一次就错过了它。