Я пытаюсь создать синтаксический анализатор / objectMapper, который будет создавать объекты Objective C для JSON, который я потребляю из службы REST.
Я черпал вдохновение из RestKit, так как все мои сущности содержат «список декодирования»msgstr "который сообщает мапперу, какие ключи 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 знал как можно меньше.
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 без вложенных объектов, я былпытаясь построить синтаксический анализатор так, чтобы он также учитывал отношения, создавая необходимые объекты и вставляя их в корневой объект, это должно быть рекурсивно, и я продолжаю сталкиваться с тупиками.
Я бы хотелкак некоторая помощь в том, как я мог бы подойти к этому или к любому пониманию, как будто что-то подобное существует в виде библиотеки.Может быть, для использования или просто для решения частей, с которыми у меня есть проблемы.
Заранее спасибо.