Cómo analizar JSON en la aplicación iOS

Estoy recibiendo una respuesta de Twitter en forma de una cadena,

Lo que necesito es enviar las partes donde está un comentario a una matriz,

aquí un ejemplo de la secuencia

[{"geo":null,"coordinates":null,"retweeted":false,... "text":"@KristinaKlp saluditos y besos d colors!"},{"geo":null,"coordinates... 

así que lo que realmente necesito son las publicaciones después del "text": "=

@KristinaKlp saluditos y besos d colors!

Entonces, ¿cómo puedo tomar la secuencia y analizarla para get todos los posts en una matriz con suerte?

¡Muchas gracias!

No hice JSON analizándome en una aplicación de iOS, pero debería poder usar una biblioteca como json-framework . Esta biblioteca le permitirá analizar fácilmente JSON y generar json desde dictionarys / matrices (eso es realmente todo lo que JSON está compuesto por).

SBJson docs:

JSON se asigna a los types Objective-C de la siguiente manera:

  • nulo -> NSNull
  • cadena -> NSString
  • array -> NSMutableArray
  • object -> NSMutableDictionary
  • true -> NSNumber's -numberWithBool: YES
  • false -> NSNumber's -numberWithBool: NO
  • integer hasta 19 dígitos -> NSNumber's -numberWithLongLong:
  • todos los demás numbers -> NSDecimalNumber

Dado que Objective-C no tiene una class dedicada para valores booleans, estos se convierten en instancias de NSNumber. Sin embargo, dado que estos se inicializan con el método -initWithBool: método, vuelven a pasar a JSON de manera adecuada. En otras palabras, no se convertirán repentinamente en 0 o 1; serán representados de nuevo como "verdadero" y "falso".

Como optimization, integers de hasta 19 dígitos de longitud (la longitud máxima para integers largos largos firmados) se convierten en instancias NSNumber, mientras que las complejas se convierten en instancias NSDecimalNumber. Así podemos evitar cualquier pérdida de precisión, ya que JSON permite numbers ridículamente grandes.

@page objc2json Objective-C a JSON

Los types Objective-C se asignan a los types JSON de la siguiente manera:

  • NSNull -> null
  • NSString -> cadena
  • NSArray -> array
  • NSDictionary -> object
  • NSNumber's -initWithBool: YES -> true
  • NSNumber's -initWithBool: NO -> false
  • NSNumber -> número

@note En JSON, las keys de un object deben ser cadenas. Las keys NSDictionary no necesitan serlo, pero intentar convertir un NSDictionary con keys no string en JSON arrojará una exception.

Las instancias NSNumber creadas con el método -numberWithBool: se convierten en los valores booleans "true" y "false" de JSON, y viceversa. Cualquier otra instancia de NSNumber se convierte en un número JSON de la forma esperada.

Tutoriales

¿Hay algún tutorial? ¡Sí! Estos son todos tutoriales proporcionados por personas de terceros:

JSON Framework para iPhone : un tutorial de Flickr en tres partes de John Muchow. JSON sobre HTTP en el iPhone – por Dan Grigsby. AS3 a Cocoa touch : JSON de Andy Jacobs.

Hay otras bibliotecas que puedes probar, como TouchJSON, JSONKit, Yet Another JSON Library

NSJSONSerialization hace el trabajo de convertir sus datos JSON en estructuras de datos utilizables como NSDictionary o NSArray muy bien. Lo recomiendo, incluso más porque es parte de la interfaz pública de Cocoa y Apple lo mantiene.

Sin embargo, si desea asignar el contenido de su JSON a sus objects Objective-C, deberá asignar cada atributo de NSDictionary / NSArray a su propiedad de object. Esto podría ser un poco doloroso si sus objects tienen muchos attributes.

Para automatizar el process, le recomiendo que utilice la categoría Motis (proyecto personal) en NSObject para lograrlo, por lo que es muy liviano y flexible. Puedes leer cómo usarlo en esta publicación . Pero solo para mostrarte, solo necesitas definir un dictionary con la asignación de tus attributes de object JSON a tus nombres de properties de object Objective-C en tus subclasss NSObject:

 - (NSDictionary*)mjz_motisMapping { return @{@"json_attribute_key_1" : @"class_property_name_1", @"json_attribute_key_2" : @"class_property_name_2", ... @"json_attribute_key_N" : @"class_property_name_N", }; } 

y luego realiza el análisis haciendo:

 - (void)parseTest { NSData *data = jsonData; // <-- YOUR JSON data // Converting JSON data into NSArray (your data sample is an array) NSError *error = nil; NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; if (error) return; // <--- If error abort. // Iterating over raw objects and creating model instances NSMutableArray *parsedObjects = [NSMutableArray array]; for (NSDictionary *rawObject in jsonArray) { // Creating an instance of your class MyClass instance = [[MyClass alloc] init]; // Parsing and setting the values of the JSON object [instance mjz_setValuesForKeysWithDictionary:rawObject]; [parsedObjects addObject:instance]; } // "parseObjects" is an array with your parsed JSON. // Do whatever you want with it here. } 

La configuration de las properties del dictionary se realiza a través de KeyValueCoding (KVC) y puede validar cada atributo antes de configurarlo a través de la validation de KVC.

Hace poco tuve que hacer esto. Después de ver las diferentes opciones, lanzé JSONKit a mi aplicación (lo encontré en una discusión de JSON en StackOverflow). ¿Por qué? A) es MUY MUY simple. Quiero decir, todo lo que tiene son las funciones básicas de análisis / emisión, ¿qué más necesitas? B) es MUY MUY rápido. Sin gastos generales, simplemente haga el trabajo.

Debo tener en count que nunca antes había hecho JSON; solo había oído hablar del término y ni siquiera sabía cómo deletrearlo. Pasé de la nada a una aplicación de trabajo en aproximadamente 1 hora. Simplemente agregue una class a su aplicación (la .h, .m), instálela y llame al analizador a un object de dictionary. Voila Si contiene una matriz, simplemente obtendrá objectForKey, y lo lanzará como NSArray. Es muy difícil hacerlo más simple y muy rápido.

Para una buena comparación de la velocidad de las diferentes bibliotecas para el análisis de JSON en iOS, eche un vistazo a The Ultimate Showdown .

 -(IBAction)btn_parse_webserivce_click:(id)sender { // Take Webservice URL in string. NSString *Webservice_url = self.txt_webservice_url.text; NSLog(@"URL %@",Webservice_url); // Create NSURL from string. NSURL *Final_Url = [NSURL URLWithString:Webservice_url]; // Get NSData from Final_Url NSData* data = [NSData dataWithContentsOfURL: Final_Url]; //parse out the json data NSError* error; // Use NSJSONSerialization class method. which converts NSData to Foundation object. NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; // Create Array NSArray* Response_array = [json objectForKey:@"loans"]; NSLog(@"Array: %@", Response_array); // Set Response_array to textview. self.txt_webservice_response.text = [NSString stringWithFormat:@"%@" ,Response_array]; }