2013-05-11 130 views
1

是否有可能“扁平化”一个NSDictionary?我检索JSON数据,并用它填充字典。它看起来像这样:拼合嵌套的NSDictionary

data: { 
    author = "user" 
    message = "message" 
     response: { 
      author = "user2" 
      message = "message2" 
       response2: { 
        author = "user" 
        message = "message3" 

级别的数量会随每个响应而不同。我完全不知道如何使用这些数据。走正常路线会

NSString *author = [[messages objectForKey:@"data"] objectForKey:@"author"]; 

,但因为我不知道该词典将有多深,这并不工作。有没有人知道处理这个问题的方法?

+2

你需要更具体的了解你正在试图提取什么。例如,这个例子在3个不同的地方有“作者”。你需要获得什么信息? – rdelmar 2013-05-11 04:39:49

回答

2

以下是一种扁平化字典的方法,同时保留对父消息的引用。

@interface NSDictionary(Flatten) 
- (NSArray*) flattenWithParent:(id)parent; 
- (NSArray*) flatten; 
@end 

@implementation NSDictionary(Flatten) 
- (NSArray*) flattenWithParent:(id)parent 
{ 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    NSMutableArray  *flat = [NSMutableArray arrayWithObject:dict]; 

    if (parent != nil) 
     dict[@"parent"] = parent; 

    [self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
     if ([value isKindOfClass:[NSDictionary class]]) 
      [flat addObjectsFromArray:[value flattenWithParent:dict]]; 
     else 
      [dict setObject:value forKey:key]; 
    }]; 

    return flat; 
} 

- (NSArray*) flatten 
{ 
    return [self flattenWithParent:nil]; 
} 

@end 


int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     NSDictionary *data = @{ 
      @"author": @"user", 
      @"message":@"message", 
      @"response": @{ 
        @"author": @"user2", 
        @"message":@"message2", 
        @"response": @{ 
          @"author": @"user", 
          @"message":@"message3" 
        } 
       } 
      }; 

     NSArray *messages = [data flatten]; 
     NSLog(@"Message count = %lu", messages.count); 
     NSLog(@"%@",messages); 
    } 
    return 0; 
} 

我得到以下(重新格式化)输出:

2013-05-11 09:37:31.293 Dummy[22896:303] Message count = 3 
2013-05-11 09:37:31.295 Dummy[22896:303] (
{ 
    author = user; 
    message = message; 
}, 
{ 
    author = user2; 
    message = message2; 
    parent =   { 
     author = user; 
     message = message; 
    }; 
}, 
{ 
    author = user; 
    message = message3; 
    parent =   { 
     author = user2; 
     message = message2; 
     parent =    { 
      author = user; 
      message = message; 
     }; 
    }; 
}) 
+0

谢谢!这有很大的帮助 – user2272641 2013-05-11 18:19:42