Où JSON_CATEGORY_DATA_URL_STRING
correspond à l'URL de mon flux, qui renvoie la valeur suivante:
[
{
"group":"For Sale",
"code":"SSSS"
},
{
"group":"For Sale",
"category":"Wanted",
"code":"SWNT"
}
]
Je n'arrive pas à obtenir une Nice NSDictionary
(ou NSArray
) du code suivant:
+ (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;
}
J'ai lu de nombreux articles à ce sujet, mais je ne le comprends pas.
Avec IOS5, vous pouvez utiliser NSJSONSerialization pour sérialiser le JSON.
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
J'espère que cela vous aidera.
Vous ne pouvez pas simplement transformer une chaîne en dictionnaire et vous attendre à analyser le JSON. Vous devez utiliser une bibliothèque d'analyse JSON pour extraire cette chaîne et la convertir en dictionnaire.
J'ai fait un cours qui facilite cette tâche. Il utilise NSJSONSerialization de iOS 5. Clonez le depuis github ici .
Vous devez utiliser un analyseur JSON. voici le code édité
+ (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;
}
cela devrait être le code pour obtenir le NSDictionary. mais vous json string est un tableau donc utilisez plutôt.
+ (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;
}
Edit: Vous devez utiliser JSON.framework pour appeler la méthode JSONValue.
Vous devez également renvoyer json_dict
au lieu de json_string
car json_string
est de type NSString
et non pas NSDictionary
ou NSArray
.
et ne l'autorelease pas, car c'est votre variable de classe
créer une méthode pour fetchjson data.Pass votre url dans 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]);
}
});
}];
}
appelez fetchjsonmethod n'importe où.
[NSThread detachNewThreadSelector: @selector (fetchdata) toTarget: self withObject: nil];