Estoy intentando construir un analizador/objetoMapper que construirá objetos de Objective C para el JSON que consumo de un servicio REST.Biblioteca de asignación de objetos de JSON a NSObjects
Me inspiré en RestKit al hacer que todas mis entidades tengan una "lista de decodificación" que le dice a un asignador qué claves JSON corresponden a cada objeto. De esta manera:
//ObjectEntity implementation
+ (NSDictionary*) mapProperties {
/*
localPropertiy - JSONProperty
*/
return @{
@"name": @"name",
@"category": @"category",
@"possible_scopes": @"possibleScopes",
@"possible_descriptions": @"possibleDescriptions",
@"key": @"keys"
};
}
+ (NSDictionary*) mapRelations {
return [NSDictionary dictionary];
}
lo hice porque me gusta la encapsulación de estos valores cambiables para estar en el objeto que hacen referencia. Haciendo que el Mapper sepa lo menos posible.
El asignador hace algo como esto:
+ (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;
}
Así que el mensaje del analizador/mapeador de la siguiente manera:
NSArray *objects = [ObjectParser parseData:self.responseData intoObjectsOfType:ObjectEntity.class];
Esto significa que el analizador debe saber lo que mi objeto raíz es, que es bien como el objeto que lo recupera del servicio web, por supuesto, tiene este conocimiento.
Lo anterior sólo funciona para JSON sin objetos anidados, que han estado tratando de construir el analizador de manera que tomará las relaciones en cuenta también, la construcción de los objetos necesarios e insertándolos en el objeto raíz, esto tiene que ser recursivo y sigo corriendo en callejones sin salida.
Me gustaría obtener alguna ayuda sobre cómo podría abordar esto o cualquier idea de si algo como esto existe como una biblioteca. Tal vez para usar o tal vez solo para abordar las partes con las que tengo problemas.
Gracias de antemano.
+1 porque estás haciendo algo genial! –
Gracias Alec, parece que las cosas geniales son bastante difíciles de entender en estos días. – RickiG
Tenemos una configuración bastante compleja para enviar/recibir JSON, pero la esencia es que todas las clases habilitadas para JSON tienen un método 'initWithDict' y un método' asDictionary'. Cada clase es responsable de leer/escribir los datos que "posee", y a su vez llama a los mismos métodos para las clases de componentes. –