18 votos

Serializar y Deserializar Objective-C los objetos en JSON

Necesito para serializar y deserializar objective-c los objetos en JSON para almacenar en CouchDB. ¿La gente tiene algún código de ejemplo para las mejores prácticas para una solución general? Me miró un par de JSON marco y se detuvo en la NSDictionary/NSArray nivel. es decir, Una gran cantidad de marco de serializar y deserializar NSDictionary/NSArray en JSON. Pero todavía tengo que hacer el trabajo para convertir NSDictionary en Objective-C los objetos.

Para hacer las cosas más complejas, mi Objeto puede tener referencia a un NSArray/NSDictionary de Objeto de Bs.

Mi pregunta es muy similar a esta pregunta con la adición de la colección requisito.

Crear instancias de Clase Personalizada de NSDictionary

20voto

Malcolm Mashmallow Puntos 1321

Finalmente podemos resolver este problema fácilmente usando JSONModel. Este es el mejor método hasta ahora. JSONModel es una biblioteca que genéricamente serializar/deserializar el objeto basado en la Clase. Usted puede incluso utilizar no nsobject basado en la propiedad como int, short y float. También puede atender anidada compleja JSON.

Teniendo en cuenta este JSON ejemplo:

{ "accounting" : [{ "firstName" : "John",  
                    "lastName"  : "Doe",
                    "age"       : 23 },

                  { "firstName" : "Mary",  
                    "lastName"  : "Smith",
                    "age"       : 32 }
                              ],                            
  "sales"      : [{ "firstName" : "Sally", 
                    "lastName"  : "Green",
                    "age"       : 27 },

                  { "firstName" : "Jim",   
                    "lastName"  : "Galley",
                    "age"       : 41 }
                  ]}

1) Deserializar ejemplo. en el archivo de encabezado:

#import "JSONModel.h"

@interface Person : JSONModel 
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSNumber *age;
@end

@protocol Person;

@interface Department : JSONModel
@property (nonatomic, strong) NSMutableArray<Person> *accounting;
@property (nonatomic, strong) NSMutableArray<Person> *sales;
@end

en el archivo de implementación:

#import "JSONModelLib.h"
#import "myJSONClass.h"

NSString *responseJSON = /*from example*/;
Department *department = [[Department alloc] initWithString:responseJSON error:&err];
if (!err)
{
    for (Person *person in department.accounting) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }

    for (Person *person in department.sales) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }
}

2) Serializar Ejemplo. En el archivo de implementación:

#import "JSONModelLib.h"
#import "myJSONClass.h"

Department *department = [[Department alloc] init];

Person *personAcc1 = [[Person alloc] init];
personAcc1.firstName = @"Uee";
personAcc1.lastName = @"Bae";
personAcc1.age = [NSNumber numberWithInt:22];
[department.accounting addOject:personAcc1];

Person *personSales1 = [[Person alloc] init];
personSales1.firstName = @"Sara";
personSales1.lastName = @"Jung";
personSales1.age = [NSNumber numberWithInt:20];
[department.sales addOject:personSales1];

NSLog(@"%@", [department toJSONString]);

Y este es NSLog resultado de Serializar ejemplo:

{ "accounting" : [{ "firstName" : "Uee",  
                    "lastName"  : "Bae",
                    "age"       : 22 }
                 ],                            
  "sales"      : [{ "firstName" : "Sara", 
                    "lastName"  : "Jung",
                    "age"       : 20 }
                  ]}

7voto

Jens Alfke Puntos 1031

Suena como que usted está buscando una serialización de la biblioteca que permite convertir los objetos de clases personalizadas en JSON, y luego reconstituir la espalda. La serialización de los inmuebles-tipos de lista (NSArray, NSNumber, etc.) ya existe en la 3ª parte de las bibliotecas, e incluso está integrado en OS X 10.7 y iOS 5.

Entonces, creo que la respuesta es, básicamente, "no". Le hice esta pregunta exacta de un mes o dos atrás, en el cacao-dev lista de correo, y el más cercano que tengo a un éxito fue de Mike Abdullah, que apunta a un experimentales de la biblioteca que él había escrito:

https://github.com/mikeabdullah/KSPropertyListEncoder

Este archivos de objetos en memoria de las listas de propiedades, pero como he dicho ya existen APIs para la conversión de aquellos en JSON.

También hay un comercial app llamada Objetivar que afirma ser capaz de hacer algo similar:

http://tigerbears.com/objectify/

Es posible que voy a terminar la aplicación de lo que estás pidiendo, como parte de mi CouchCocoa de la biblioteca, pero no he buceado en que la tarea aún.

https://github.com/couchbaselabs/CouchCocoa

2voto

zekel Puntos 2300

Puede que desee probar JTObjectMapping. Su descripción:

JTObjectMapping Inspirado por RestKit. Un objetivo muy simple-c marco que se asigna una respuesta JSON de NSDictionary o NSArray a NSObject subclases para iOS.

Es muy pequeño (a diferencia de RestKit) y funciona muy bien.

1voto

Colin Sullivan Puntos 117

Esto es posible mediante el uso de la RestKit de la biblioteca de la asignación de objetos del sistema.

http://restkit.org/

0voto

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: