Cómo analizar JSON en la aplicación de iOS

Recibo una respuesta de twitter en forma de cadena,

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

aquí un ejemplo de la cadena

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

entonces lo que realmente necesito son las publicaciones después de “text”: “=

@KristinaKlp saluditos y besos d colores!

Entonces, ¿cómo puedo tomar la cadena y analizarla para que obtenga todos los mensajes en una matriz con suerte?

¡Muchas gracias!

No he hecho el análisis de JSON 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 a partir de diccionarios / matrices (de eso se compone realmente todo JSON).

SBJson documentos:

JSON está asignado a los tipos Objective-C de la siguiente manera:

  • null -> NSNull
  • cadena -> NSString
  • array -> NSMutableArray
  • objeto -> NSMutableDictionary
  • true -> NSNumber’s -numberWithBool: SÍ
  • falso -> NSNumber’s -numberWithBool: NO
  • entero de hasta 19 dígitos -> NSNumber’s -numberWithLongLong:
  • todos los demás números -> NSDecimalNumber

Dado que Objective-C no tiene una clase dedicada para valores booleanos, estos se convierten en instancias NSNumber. Sin embargo, dado que estos se inicializan con el método -initWithBool: realizan un viaje de ida y vuelta a JSON correctamente. En otras palabras, de repente no se volverán silenciosamente 0 o 1; serán representados como ‘verdadero’ y ‘falso’ de nuevo.

Como una optimización, los enteros de hasta 19 dígitos de longitud (la longitud máxima para los enteros largos y firmados) se convierten en instancias NSNumber, mientras que los complejos se convierten en instancias NSDecimalNumber. Por lo tanto, podemos evitar cualquier pérdida de precisión ya que JSON permite números ridículamente grandes.

@page objc2json Objective-C a JSON

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

  • NSNull -> null
  • NSString -> cadena
  • NSArray -> array
  • NSDictionary -> objeto
  • NSNumber’s -initWithBool: YES -> true
  • NSNumber’s -initWithBool: NO -> false
  • NSNumber -> number

@note En JSON, las claves de un objeto deben ser cadenas. Las claves de NSDictionary no necesitan serlo, pero intentar convertir un NSDictionary con claves que no sean de cadena en JSON generará una excepción.

Las instancias de NSNumber creadas con el método -numberWithBool: se convierten en los valores “verdaderos” y “falsos” booleanos de JSON, y viceversa. Cualquier otra instancia de NSNumber se convierte a un número JSON de la manera que usted esperaría.

Tutoriales

¿Hay algún tutorial? ¡Sí! Estos son todos los tutoriales proporcionados por 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 to Cocoa touch : JSON por Andy Jacobs.

Hay otras bibliotecas que puedes ver y también 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 objetos Objective-C, tendrá que asignar cada atributo desde NSDictionary / NSArray a la propiedad de su objeto. Esto podría ser un poco doloroso si sus objetos tienen muchos atributos.

Para automatizar el proceso, le recomiendo usar la categoría Motis (proyecto personal) en NSObject para lograrlo, por lo tanto, es muy ligero y flexible. Puedes leer cómo usarlo en esta publicación . Pero solo para mostrarte, solo necesitas definir un diccionario con la asignación de tus atributos de objeto JSON a tus nombres de propiedades de objeto Objective-C en tus subclases 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 realice 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 configuración de las propiedades del diccionario se realiza a través de KeyValueCoding (KVC) y puede validar cada atributo antes de configurarlo a través de la validación de KVC.

Hace poco tuve que hacer esto. Después de ver las diversas opciones, lancé 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: solo haz el trabajo.

Debo señalar que nunca antes había hecho JSON, solo escuché el término y ni siquiera sabía cómo deletrearlo. Pasé de la nada a una aplicación en funcionamiento, en aproximadamente 1 hora. Simplemente agregue una clase a su aplicación (.h, .m), cree una instancia y llame al analizador a un objeto de diccionario. Voila. Si contiene una matriz, simplemente obtienes la objectForKey, echándola como una NSArray. Es realmente difícil ser más simple que eso, y muy rápido.

Para una buena comparación de la velocidad de las diferentes bibliotecas para el análisis 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]; }