Я пытаюсь создать парсер /objectMapper, который будет создавать объекты Objective C для JSON, которые я использую из службы REST.
Я немного вдохновил RestKit на то, что мои Entities все держат "список расшифровки", который сообщает картографу, с которым идут ключи JSON, с какими объектами. Вот так:
//ObjectEntity implementation
+ (NSDictionary*) mapProperties {
/*
localPropertiy - JSONProperty
*/
return @{
@"name": @"name",
@"category": @"category",
@"possible_scopes": @"possibleScopes",
@"possible_descriptions": @"possibleDescriptions",
@"key": @"keys"
};
}
+ (NSDictionary*) mapRelations {
return [NSDictionary dictionary];
}
Я сделал это, потому что мне нравится инкапсуляция этих изменяемых значений в объект, который они ссылаются. Создание Mapper известно как можно меньше.
Преобразователь делает что-то вроде этого:
+ (NSArray*) parseData:(NSData*) jsonData intoObjectsOfType:(Class) objectClass {
//Parser result from web service
NSError *error = nil;
CJSONDeserializer *deserializer = [CJSONDeserializer deserializer];
[deserializer setNullObject:nil];
NSArray *objects = [deserializer deserializeAsArray:jsonData error:&error];
NSMutableArray *result = [NSMutableArray array];
for (NSDictionary *o in objects) {
id <EntityProtocol> entity = [[objectClass alloc] init];
NSDictionary *jsonKeys = objectClass.mapProperties;
for (NSString *key in jsonKeys.allKeys) {
NSString *objectProperty = jsonKeys[key];
NSString *value = o[key];
if (value)
[entity setValue:value forKey:objectProperty];
}
[result addObject:entity];
}
return (NSArray*)result;
}
Итак, я сообщаю синтаксический анализатор/сопоставление следующим образом:
NSArray *objects = [ObjectParser parseData:self.responseData intoObjectsOfType:ObjectEntity.class];
Это означает, что синтаксический анализатор должен знать, что такое мой корневой объект, что прекрасно, так как объект, получающий его из веб-службы, имеет эти знания.
Вышеописанное работает только для JSON без вложенных объектов, я пытаюсь создать парсер так, чтобы он учитывал отношения, а также создавал необходимые объекты и вставлял их в корневой объект, это должно быть рекурсивным и я продолжаю тупик.
Мне бы хотелось, чтобы я мог подходить к этому или любому пониманию, как будто что-то вроде этого существует как библиотека. Возможно, для использования или, возможно, для решения проблем, с которыми у меня возникают проблемы.
Спасибо заранее.