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];