我正在尝试构建一个解析器/objectMapper,它将为我从 REST 服务使用的 JSON 构建 Objective C 对象。
我从 RestKit 中获得了一些灵感,让我的实体都包含一个“解码列表”,它告诉映射器哪些 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];
}
我这样做是因为我喜欢将这些可变值封装在它们引用的对象中。让映射器知道得尽可能少。
映射器执行如下操作:
+ (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];
这意味着解析器必须知道我的根对象是什么,这很好,因为从 Web 服务检索它的对象当然具有这些知识。
上面的内容仅适用于没有嵌套对象的 JSON,我一直在尝试构建解析器,以便它也考虑到关系,构建所需的对象并将它们插入到根对象中,这需要是递归的,我保留陷入死胡同。
我想要一些帮助来帮助我如何处理这个问题或任何见解,就好像这样的东西作为图书馆存在一样。也许是为了使用,或者也许只是为了解决我遇到问题的部分。
先感谢您。