2013-05-11 3 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

:

@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; } 

나는 다음 (다시 포맷) 출력을 얻을. 이 예제에는 3 개의 다른 장소에 "작성자"가 있습니다. 어떤 정보를 얻을 필요가 있습니까? – rdelmar

답변

2

상위 메시지에 대한 참조를 유지하면서 사전을 병합하는 방법 중 하나입니다. 당신은 추출하려는 일에 대해 더 구체적으로해야 할

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

관련 문제