/* * usage: * [self objectForKeypath:@"someKey.3.someNestedKey.2" inJSON:myJSONObject]; */ - (id)objectForKeypath:(NSString *)keypath inJSON:(NSData *)json { if (!keypath || !json) {return nil;} __block NSInteger depth = 0; NSArray *keys = [keypath componentsSeparatedByString:@"."]; id result = [NSJSONSerialization JSONObjectWithData:json options:kNilOptions error:nil]; id (^objectAtPath)(NSString *, id) = ^id(NSString *path, id collection) { if (collection) { depth++; if ([collection isKindOfClass:[NSDictionary class]]) { return [(NSDictionary *)collection objectForKey:path]; } else if ([collection isKindOfClass:[NSArray class]]) { return [(NSArray *)collection objectAtIndex:[path integerValue]]; } } return nil; }; while (depth < keys.count) { if (!result) { return nil; } result = objectAtPath(keys[depth], result); } return result; }