2010-09-14 7 views
14

Yo analizo algunos JSON desde un servicio web, esto me da una NSDictionary, utilizo este diccionario a las propiedades pobladas en un valueEntity de tipo NSObject por¿Hay un reverso "setValuesForKeysWithDictionary" - makeDictionaryWithObjectProperties?

[myObject setValuesForKeysWithDictionary:JSONDict]; 

(myObject tiene los mismos nombres de propiedades y tipos como el diccionario desde el analizador JSON)

name = name 
count = count 
startDate = startDate 
etc.. 

¿hay una manera de ir a otro lado, donde tengo una NSDictionary que me gustaría tener "llenos" con las propiedades y sus valores de una subclase mi NSObject. Como sugiero en el título, algo a lo largo de las líneas de esto:

una manera

MyObject *myObject = [[MyObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

al revés

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties]; 

La razón de esto es que yo tener un valueEntity que, por protocolo, todos mis puntos de vista son conformes, pero me gustaría llenar un NSManagedObject con los valores también. Así que pensé que usando el NSDictionary como un paso intermedio, puedo mover una categoría en mi NSManagedObject que establece cada propiedad manualmente desde el valor en mi objeto que subclasifica NSObject.

Con un diccionario que pueda ir:

[myManagedObject setValuesForKeysWithDictionary:dict]; 

No puedo obtener la representación diccionario de vuelta una vez que he hecho lo anterior?

Respuesta

17

Sí, el método es:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys 

se pasa en una serie de teclas que representan las propiedades de los objetos que le interesan, y volver un diccionario que contiene los valores de las propiedades.

El protocolo NSKeyValueCoding define una serie de métodos potentes y muy útiles; es una gran cosa para familiarizarse.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

También hay una guía complementaria muy valiosa:

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

+0

Hola jlehr, gracias :) Veo que no es tan automático como el [obj setValuesforKeysWithDictionary: dict], pero de nuevo, como señala Yuji, esto hace posible seleccionar y elegir las propiedades y evitar las relaciones, etc. Esto es realmente genial ya que ahora puedo mantener una única matriz de nombres de propiedades que se comparten entre objetos y esta es una solución mucho más flexible. Gracias de nuevo, irá directo a las guías. – RickiG

+0

Hola Ricki, no hay problema :-) – jlehr

+0

Gracias por responder ... Estaba buscando lo mismo ... :) – Mrunal

5

¿Realmente desea conseguir todas las propiedades? A menudo no tiene sentido obtener todas las propiedades de un objeto como un diccionario. Por ejemplo, si un NSManagedObject contiene una relación, ¿quiere obtenerla también en el diccionario? Si es así, ¿cómo quieres representarlo?

Como dijo jlehr, es mejor alimentar un conjunto de claves explícitamente usando dictionaryWithValuesForKeys:.

Dicho esto, utilizando el temido tiempo de ejecución Objective-C, puede implementar makeDictionaryWithObjectProperties. Use class_getPropertyList y property_getName. No detallaré cómo hacerlo, porque si sigues este enfoque, sabes lo que estás haciendo.Por cierto, es muy peligroso para usted asignar un objeto JSON devuelto de Internet a NSManagedObject usando setValuesForKeysWithDictionary:. Porque, si el objeto JSON contiene una clave adicional que no espera, su código puede bloquearse repentinamente. Por lo tanto, no hagas eso.

Otro comentario: el pseudo-código

NSObject *myObject = [[NSObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

no tiene mucho sentido: si se le puede llamar setValuesForKeysWithDictionary: contra NSObject, pero desgraciadamente se producirá un error, no porque se puede setValue:forKey: para cualquiera de las entradas en JSONDict a un vainilla NSObject. Supongo que lo sabes, pero me gustaría decirlo explícitamente para que un novato que se encuentre con esta página no se deje engañar.

+0

Hola Yuji y gracias también. No debería seguir la ruta de tiempo de ejecución por el momento :) Haré que el ejemplo de NSObject sea algo más sensato. Estoy muy contento de que hayas comprendido lo que estaba intentando lograr a pesar del hecho de que me faltaban las palabras para describirlo. precisamente. De hecho, analizo, refino y valido mis valores JSON antes de que entren "en" el objeto, pero gracias de nuevo, obtengo algunos buenos consejos de sus respuestas. – RickiG

+0

De nada :) – Yuji

1

This guy here usó magia de tiempo de ejecución para obtener todas las propiedades declaradas en un objeto y obtuvo el diccionario sin proporcionar manualmente los nombres de las propiedades.

Y también encontré este nice github repo, Ellos prácticamente hacen el mismo truco, pero en un buen paquete. También tienen la capacidad de crear un json o plist a partir de un objeto.

+0

[AutoMagicCoding] (https://github.com/psineur/NSObject-AutomagicCoding) fue realmente útil para mí, justo lo que estaba buscando :) – Alex75

Cuestiones relacionadas