2011-04-21 10 views
6

Estoy mapeando datos formateados en JSON desde un servidor web a clases de Objective C (modelos NSManagedObjects modelados en Xcode, manejados por Core Data). Para cada atributo de la clase Objective C, necesito:¿Cómo asignar los objetos JSON a las clases Objective C?

  1. determinar si existe la clave del atributo en el objeto JSON,
  2. determinar si el valor de esa clave no es nulo, y
  3. Pase el valor a la instancia de clase modelada si las condiciones 1 y 2 son verdaderas

en este momento, estoy difíciles de codificar esta secuencia para cada uno de los atributos, por lo que cada atributo necesita un código como el siguiente:

// dictObject is the JSON object converted into a NSDictionary, 
// and person is the instance of the modeled class 

if ([dictObject objectForKey:@"nameFirst"] && 
    [dictObject objectForKey:@"nameFirst"] != [NSNull null]) { 
    person.nameFirst = [dictObject objectForKey:@"nameFirst"]; 
} 

Además de requerir un lote de código para manejar las diferentes clases, esto parece kludgy y frágil: cualquier cambio de nombre (o localización del idioma) haría que la asignación fallara.

Tiene que haber una mejor manera ... ¿Qué me estoy perdiendo?

Respuesta

10

Hay un marco llamado RestKit que le permite hacer precisamente eso. Yo no lo he probado, pero parece ser apoyado por una empresa activa y disponible como código abierto: http://restkit.org/

+0

Gracias pokstad-no había visto eso antes. Descargué RestKit y he estado jugando con él ... agrega mucho volumen a la aplicación (¡36 MB para la carpeta de origen!), Pero bien puede valer la pena. Definitivamente aceptaré tu respuesta si la uso. (Todavía espero que alguien responda con un enfoque más "nativo") – Dan

+0

No hay problema. No estoy seguro de lo que quieres decir con nativo. Ese ReskKit está hecho específicamente para aplicaciones basadas en Cocoa. Además, el tamaño del código fuente casi siempre es más grande que el tamaño binario, por lo que no me preocuparía por los 36 MB en lo que respecta al tamaño binario compilado. – pokstad

+0

Bastante limpio: RestKit parece una excelente solución, pero si lo implemento, aprenderé cómo implementar RestKit, en lugar de aprender mejor las habilidades de Obj-C :) (Aunque, por supuesto, podría argumentarse que aprender a implementar marcos bien _es_ aprender Obj-C better.) – Dan

11

Para el manejo de los NULL valores, hacen uso de una categoría en NSDictionary. Yo uso una categoría que tiene este aspecto:

NSDictionary + Utility.h

#import <Foundation/Foundation.h> 


@interface NSDictionary (Utility) 
- (id)objectForKeyNotNull:(id)key; 
@end 

NSDictionary + Utility.m

#import "NSDictionary+Utility.h" 


@implementation NSDictionary (Utility) 

- (id)objectForKeyNotNull:(NSString *)key { 
    id object = [self objectForKey:key]; 
    if ((NSNull *)object == [NSNull null] || (CFNullRef)object == kCFNull) 
     return nil; 

    return object; 
} 

@end 

Recuperar todos los valores de su diccionario JSON como esto :

+0

Gracias, Wolfgang, esto en realidad es realmente útil. Voy a aceptar la respuesta de pokstad porque es más robusta, pero definitivamente haré uso de este patrón también. – Dan

1

Como una alternativa ligera a RestKit, puede probar GoldenFleece, que convierte objetos JSON y Objective-C utilizando un patrón de convención sobre configuración inspirado en Jackson.

Descargo de responsabilidad: soy el autor.

+0

Debe agregar una divulgación si es su propia biblioteca que está empujando –

Cuestiones relacionadas