Использование Mantle с API Sickbeard

#objective-c #github-mantle

#objective-c #github-mantle

Вопрос:

Я пытаюсь сопоставить ответы из Sickbeard API с моими объектами с помощью Mantle, но я не могу понять, как это сделать, поскольку ответ основан на значении ключа с использованием идентификатора TVDB в качестве ключа, например:

 "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}] , но вместо этого объекты, которым присвоен некоторый уникальный идентификатор, я не уверен, как мне следует сопоставить его с моими 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:amp;error];
    [shows addObject:show];
}];

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

Вы можете написать свой собственный преобразователь, чтобы инкапсулировать эту логику и применить ее к ключу данных, если это необходимо.