#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);
Вы можете написать свой собственный преобразователь, чтобы инкапсулировать эту логику и применить ее к ключу данных, если это необходимо.