我想构建一个解析器/ objectMapper,它将为我从REST服务使用的JSON构建Objective C对象。从JSON到NSObject的对象映射库
我从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];
}
我这样做是因为我喜欢将这些可更改值封装在它们引用的对象中。尽可能少地使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];
这意味着解析器必须知道我的根对象是什么,这是很好,因为从Web服务中检索它的对象当然有这方面的知识。
上面只适用于没有嵌套对象的JSON,我一直在试图构建解析器,以便它也将需要考虑的关系,建立所需的对象并将它们插入根对象,这需要递归和我一直跑到死胡同。
我想要一些帮助,以便我可以如何处理这个或任何洞察力,就好像这样的事情存在于图书馆中一样。也许是为了使用或者只是为了解决我遇到的问题。
预先感谢您。
+1因为你正在做一些很酷的事情! – 2011-05-26 11:01:23
谢谢亚历克,看起来很酷的事情现在很难弄清楚。 – RickiG 2011-05-30 21:38:21
我们有一个相当复杂的发送/接收JSON的设置,但其要点是所有启用JSON的类都有一个'initWithDict'方法和一个'asDictionary'方法。每个类都负责读取/写入它拥有的数据,然后调用组件类的相同方法。 – 2014-01-29 18:04:44