ios objective-c nsarray nsdictionary sbjson

ios - Convierta la alimentación JSON a NSDictionary



objective-c nsarray (5)

Con IOS5 puede usar NSJSONSerialization para serializar el JSON.

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

Espero que esto te ayude

Donde JSON_CATEGORY_DATA_URL_STRING es mi URL de fuente, que devuelve bien como:

[ { "group":"For Sale", "code":"SSSS" }, { "group":"For Sale", "category":"Wanted", "code":"SWNT" } ]

Parece que no puedo obtener un buen NSDictionary (o NSArray ) del siguiente código:

+ (NSDictionary *)downloadJSON { NSDictionary *json_string; NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING]; NSLog(@"%@",dataURL); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease]; NSDictionary *json_dict = (NSDictionary *)json_string; NSLog(@"json_dict/n%@",json_dict); NSLog(@"json_string/n%@",json_string); return json_string; }

He leído muchas publicaciones sobre esto, pero no lo estoy obteniendo.


Hice una clase que facilita esta tarea. Utiliza la serialización NSJSONS de iOS 5. Clonarlo desde github here .


Necesita usar el analizador JSON. aquí está el código editado

+ (NSDictionary *)downloadJSON { NSDictionary *json_string; NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING]; NSLog(@"%@",dataURL); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease]; //JSONValue is a function that will return the appropriate object like dictionary or array depending on your json string. NSDictionary *json_dict = [json_string JSONValue]; NSLog(@"json_dict/n%@",json_dict); NSLog(@"json_string/n%@",json_string); return json_dict; }

este debería ser el código para obtener el NSDictionary. pero tu json string es una matriz así que en vez de eso usa.

+ (NSArray *)downloadJSON { NSDictionary *json_string; NSString *dataURL = [NSString stringWithFormat:@"%@", JSON_CATEGORY_DATA_URL_STRING]; NSLog(@"%@",dataURL); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]]; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; json_string = [[[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]autorelease]; NSArray *json_dict = [json_string JSONValue]; NSLog(@"json_dict/n%@",json_dict); NSLog(@"json_string/n%@",json_string); return json_dict; }

Editar: necesita usar JSON.framework para llamar al método JSONValue.
también necesita devolver json_dict lugar de json_string ya que json_string es de tipo NSString y no NSDictionary o NSArray .
y no lo libere, ya que es su variable de clase


No se puede simplemente lanzar una cadena como un diccionario y esperar que analice el JSON. Debe usar una biblioteca de análisis JSON para tomar esa cadena y convertirla en un diccionario.


crea un método para recuperar datos. Pasa tu url en urlwithstring.

-(void)fetchjsondata { NSString *login= [[NSString stringWithFormat:@"your url string"]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"----%@", login); NSURL *url = [NSURL URLWithString:[login stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; //-- Get request and response though URL NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (data) { dic_property= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@", dic_property); NSLog(@"counts=%d",[[dic_property objectForKey:@"Data"]count]); } else { NSLog(@"network error, %@", [error localizedFailureReason]); } }); }]; }

llame a fetchjsonmethod en cualquier lugar.

[NSThread detachNewThreadSelector: @selector (fetchdata) toTarget: self withObject: nil];