Convierta un objeto objective de iOS c a una cadena JSON

Tengo un objective clase C como,

@interface message : NSObject { NSString *from; NSString *date; NSString *msg; } 

Tengo un NSMutableArray de instancias de esta clase de mensaje. Deseo serializar todas las instancias en NSMutableArray en un archivo JSON, utilizando las nuevas API JSONSerialization en iOS 5 SDK. Cómo puedo hacer esto ?

¿Está creando un NSDictionary de cada clave, iterando a través de cada instancia de los elementos en el NSArray? ¿Alguien puede ayudar con el código de cómo resolver esto? No puedo obtener buenos resultados en Google, ya que “JSON” sesga los resultados a las llamadas del lado del servidor y la transferencia de datos en lugar de la serialización. Muchas gracias.

EDITAR:

 NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"JSON Output: %@", jsonString); 

EDITAR: He creado una aplicación ficticia que debería ser un buen ejemplo para ti.

Creo una clase de Mensaje desde su fragmento de código;

 //Message.h @interface Message : NSObject { NSString *from_; NSString *date_; NSString *msg_; } @property (nonatomic, retain) NSString *from; @property (nonatomic, retain) NSString *date; @property (nonatomic, retain) NSString *msg; -(NSDictionary *)dictionary; @end //Message.m #import "Message.h" @implementation Message @synthesize from = from_; @synthesize date = date_; @synthesize msg = mesg_; -(void) dealloc { self.from = nil; self.date = nil; self.msg = nil; [super dealloc]; } -(NSDictionary *)dictionary { return [NSDictionary dictionaryWithObjectsAndKeys:self.from,@"from",self.date, @"date",self.msg, @"msg", nil]; } 

Luego configuré un NSArray de dos mensajes en AppDelegate. El truco es que no solo el objeto de nivel superior (notificaciones en su caso) necesita ser serializable sino que también lo hacen todos los elementos que las notificaciones contienen: Por eso creé el método de diccionario en la clase de Mensaje.

 //AppDelegate.m ... Message* message1 = [[Message alloc] init]; Message* message2 = [[Message alloc] init]; message1.from = @"a"; message1.date = @"b"; message1.msg = @"c"; message2.from = @"d"; message2.date = @"e"; message2.msg = @"f"; NSArray* notifications = [NSArray arrayWithObjects:message1.dictionary, message2.dictionary, nil]; [message1 release]; [message2 release]; NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"JSON Output: %@", jsonString); @end 

La salida cuando ejecuto la aplicación es así:

2012-05-11 11: 58: 36.018 stack [3146: f803] Salida JSON: [{“msg”: “c”, “from”: “a”, “date”: “b”}, {“msg” : “f”, “from”: “d”, “date”: “e”}]

RESPUESTA ORIGINAL:

¿Es esta la documentación que estás buscando?

Ahora puedes resolver este problema fácilmente usando JSONModel . JSONModel es una biblioteca que serializa / deserializa genéricamente su objeto en función de la clase. Incluso puede usar non-nsobject basado en propiedades como int , short y float . También puede atender el JSON nested complejo. Maneja la comprobación de errores por usted.

Deserializar ejemplo . en el archivo de encabezado:

 #import "JSONModel.h" @interface Message : JSONModel @property (nonatomic, strong) NSString* from; @property (nonatomic, strong) NSString* date; @property (nonatomic, strong) NSString* message; @end 

en archivo de implementación:

 #import "JSONModelLib.h" #import "yourPersonClass.h" NSString *responseJSON = /*from somewhere*/; Message *message = [[Message alloc] initWithString:responseJSON error:&err]; if (!err) { NSLog(@"%@ %@ %@", message.from, message.date, message.message): } 

Ejemplo de serialización . En archivo de implementación:

 #import "JSONModelLib.h" #import "yourPersonClass.h" Message *message = [[Message alloc] init]; message.from = @"JSON beast"; message.date = @"2012"; message.message = @"This is the best method available so far"; NSLog(@"%@", [person toJSONString]); 

Nota: Esto solo funcionará con objetos serializables. Esta respuesta se proporcionó anteriormente en una edición de la pregunta en sí, pero siempre busco respuestas en la sección de “respuestas” 😉

 - (NSString*) convertObjectToJson:(NSObject*) object { NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *result = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; return result; } 

Aquí hay una biblioteca que utilicé en mis proyectos BWJSONMatcher , que puede ayudarte a combinar fácilmente tu json string con tu modelo de datos con no más de una línea de código.

 ... NSString *jsonString = @"{your-json-string}"; YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString]; NSDictionary *jsonObject = @{your-json-object}; YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject]; ... YourValueObject *dataModel = instance-of-your-value-object; NSString *jsonString = [dataModel toJSONString]; NSDictionary *jsonObject = [dataModel toJSONObject]; ...