1

NSDictionary を「平坦化」することは可能ですか? JSON データを取得し、それを辞書に入力します。最終的には次のようになります。

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

レベルの量は、各応答によって異なります。私はこのデータをどのように使用するかについて完全に困惑しています。通常のルートは

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

しかし、辞書がどれだけ深いか分からないので、これはうまくいきません。これを処理する方法を知っている人はいますか?

4

1 に答える 1

2

親メッセージへの参照を保持しながら辞書をフラット化する 1 つの方法を次に示します。

@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;
        };
    };
})
于 2013-05-11T07:40:18.987 に答える