我想構建一個解析器/ 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