2014-06-17 63 views
1

我试图从Sickbeard API映射到我的对象与地幔,但我无法弄清楚如何,因为响应是基于键值使用TVDB ID作为关键,就像这样的:使用与Sickbeard API地幔

"data": { 
    "71663": { 
     "air_by_date": 0, 
     "cache": { 
      "banner": 1, 
      "poster": 1 
     }, 
     "language": "en", 
     "network": "FOX", 
     "next_ep_airdate": "2014-09-28", 
     "paused": 0, 
     "quality": "Any", 
     "show_name": "The Simpsons", 
     "status": "Continuing", 
     "tvdbid": 71663, 
     "tvrage_id": 6190, 
     "tvrage_name": "The Simpsons" 
    }, 
    "72227": { 
     "air_by_date": 0, 
     "cache": { 
      "banner": 1, 
      "poster": 1 
     }, 
     "language": "en", 
     "network": "CBS", 
     "next_ep_airdate": "", 
     "paused": 0, 
     "quality": "Any", 
     "show_name": "Two and a Half Men", 
     "status": "Continuing", 
     "tvdbid": 72227, 
     "tvrage_id": 6454, 
     "tvrage_name": "Two and a Half Men" 
    } 
} 

由于data对象不只是包含这样[{"key": value},{"key": value}]对象的数组,而是通过对象一些独特的ID键,我不知道我应该如何映射到我的SBShow类,等被定义:

#import <Foundation/Foundation.h> 
#import <Mantle.h> 

@interface SBShow : MTLModel <MTLJSONSerializing> 

@property (nonatomic, strong) NSNumber *tvdbid; 
@property (nonatomic, strong) NSString *showName; 
@property (nonatomic, strong) NSString *network; 
@property (nonatomic, strong) NSString *status; 

@end 

@implementation SBShow 

+ (NSDictionary *)JSONKeyPathsByPropertyKey { 
    return @{@"showName": @"show_name"}; 
} 

+ (NSValueTransformer *)dateJSONTransformer { 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd"]; 

    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) { 
     return [formatter dateFromString:str]; 
    } reverseBlock:^(NSDate *date) { 
     return [formatter stringFromDate:date]; 
    }]; 
} 

@end 

任何帮助将不胜感激。

回答

1

你能做到这样,通过将关键“JSON字典”的其余部分:

NSMutableArray *shows = [NSMutableArray array]; 
// data is an NSDictionary, representing the 'data' key in the JSON 
[data enumerateKeysAndObjectsUsingBlock:^(NSString *tvdbID, NSDictionary *showData, BOOL *stop) { 
    NSMutableDictionary *modelDictionary = [showData mutableCopy]; 
    modelDictionary[@"tvdbid"] = tvdbID; 
    NSError *error = nil; 
    SBShow *show = [MTLJSONAdapter modelOfClass:SBShow.class 
          fromJSONDictionary:modelDictionary 
              error:&error]; 
    [shows addObject:show]; 
}]; 

NSLog(@"Show models are %@", shows); 

您可以编写自己的变压器封装这个逻辑,并将其应用到数据的关键,如果适当。