Computer programs are the most complex things that humans make. It is also a program of life to the program. If you can read it, then you can.
Douglas Crockford, JSON Specification Author
{ "name": "Lucas", "email": "notexisting@gmail.com", "gender" : "male", "car": { "model": "i30", "year": "2013" }, "phones": [ { "ddi": "55", "ddd": "85", "number": "1111-1111" }, { "ddi": "55", "ddd": "11", "number": "2222-222" } ] }
typedef enum { GenderMale, GenderFemale } Gender; @interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *email; @property (nonatomic, assign) Gender gender; @property (nonatomic, strong) Car *car; @property (nonatomic, strong) NSArray *phones; @end @interface Car : NSObject @property (nonatomic, copy) NSString *model; @property (nonatomic, copy) NSString *year; @end @interface Phone : NSObject @property (nonatomic, copy) NSString *DDI; @property (nonatomic, copy) NSString *DDD; @property (nonatomic, copy) NSString *number; @end
EKObjectMapping * mapping = [[EKObjectMapping alloc] initWithObjectClass:[Person class]];
[mapping mapFieldsFromArray:@[@"name",@"email"]];
[mapping mapFieldsFromDictionary:@{@"ddi":@"DDI", @"ddd":@"DDD"}];
NSDictionary *genders = @{ @"male": @(GenderMale), @"female": @(GenderFemale) }; [mapping mapKey:@"gender" toField:@"gender" withValueBlock:^(NSString *key, id value) { return genders[value]; }];
[mapping hasOneMapping:[Car objectMapping] forKey:@"car"];
[mapping hasManyMapping:[Phone objectMapping] forKey:@"phones"];
// Car mapping + (EKObjectMapping *)objectMapping { EKObjectMapping * mapping = [[EKObjectMapping alloc] initWithObjectClass:[Car class]]; [mapping mapFieldsFromArray:@[@"model", @"year"]]; return mapping; } // Phone mapping + (EKObjectMapping *)objectMapping { EKObjectMapping * mapping = [[EKObjectMapping alloc] initWithObjectClass:[Phone class]]; [mapping mapFieldsFromArray:@[@"number"]]; [mapping mapFieldsFromDictionary:@{ @"ddi" : @"DDI", @"ddd" : @"DDD" }]; return mapping; } // Person mapping + (EKObjectMapping *)objectMapping { EKObjectMapping * mapping = [[EKObjectMapping alloc] initWithObjectClass:[Person class]]; NSDictionary *genders = @{ @"male": @(GenderMale), @"female": @(GenderFemale) }; [mapping mapFieldsFromArray:@[@"name", @"email"]]; [mapping mapKey:@"gender" toField:@"gender" withValueBlock:^(NSString *key, id value) { return genders[value]; }]; [mapping hasOneMapping:[Car objectMapping] forKey:@"car"]; [mapping hasManyMapping:[Phone objectMapping] forKey:@"phones"]; return mapping; }
NSDictionary * personProperties = ...; // JSON Person, , . Person * person = [[Person alloc] init]; [EKMapper fillObject:person fromExternalRepresentation:personProperties withMapping:mapping];
- (id)initWithProperties:(NSDictionary *)properties { if (self = [super init]) { [EKMapper fillObject:self fromExternalRepresentation:properties withMapping:[[self class] objectMapping]; } return self; } + (EKObjectMapping *)objectMapping { //Do nothing. Implement in subclass if you want to initialize object //via object mapping return nil; }
Person * person = [[Person alloc] initWithProperties:personProperties];
Source: https://habr.com/ru/post/176721/
All Articles