J'essaie d'analyser une chaîne JSON demandée à une API située à l'adresse suivante: http://www.physics.leidenuniv.nl/json/news.php
Cependant, j’ai du mal à analyser ce fichier json. L’erreur suivante apparaît: Unexpected end of file during string parse
J'ai cherché pendant des heures, mais je ne trouve pas de réponse à ce problème.
Mon extrait de code:
Dans mon viewDidLoad:
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
Le délégué:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSMutableData *responseData = [[NSMutableData alloc] init];
[responseData appendData:data];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSError *e = nil;
NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];
}
Quelqu'un sait une réponse à ce problème afin que je puisse analyser les données JSON?
Faire de cette façon:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[responseData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSError *e = nil;
NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:jsonData options: NSJSONReadingMutableContainers error: &e];
}
Je recommanderais de le faire de cette façon:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.physics.leidenuniv.nl/json/news.php"]];
__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
json = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
NSLog(@"Async JSON: %@", json);
}];
Ou si, pour quelque raison que ce soit (non recommandé), vous souhaitez exécuter une requête synchrone
NSData *theData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:nil];
NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:theData
options:0
error:nil];
NSLog(@"Sync JSON: %@", newJSON);
//call this method
-(void)syncWebByGETMethod
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSString *urlString = [NSString stringWithFormat:@"http://www.yoursite.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError)
{
if (data)
{
id myJSON;
@try {
myJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}
@catch (NSException *exception) {
}
@finally {
}
jsonArray = (NSArray *)myJSON;
NSLog(@"mmm %@",jsonArray);
}
}];
}
Un moyen simple de stocker les données json-url dans le dictionnaire.
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://query.yahooapis.com/v1/public/yql?q=select+%2A+from+weather.forecast+where+woeid%3D1100661&format=json"]];
NSError *error=nil;
id response=[NSJSONSerialization JSONObjectWithData:data options:
NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:&error];
if (error) {
NSLog(@"%@",[error localizedDescription]);
} else {
_query = [response objectForKey:@"query"];
NSLog(@"%@",_query);
Vous pouvez essayer cela, si facilement.
-(void)getWebServic{
NSURL *url = [NSURL URLWithString:@"----URL----"];
// 2
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
NSDictionary *jsonObject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
[self loadDataFromDictionary:(NSArray*)jsonObject];
NSLog(@"data: %@",jsonObject);
}];
// 3
[downloadTask resume]; }
Volunteermatch API, objectif C
j'utilise une méthode commune pour les appels AFNetworking WS. Utilise:
Appelez WS:
NSDictionary* param = @{
@"action":@"helloWorld",
@"query":@"{\"name\":\"john\"}"
};
[self requestWithUrlString:@"URL" parmeters:paramDictionary success:^(NSDictionary *response) {
//code For Success
} failure:^(NSError *error) {
// code for WS Responce failure
}];
Ajoutez deux méthodes: Ces deux méthodes sont communes, vous pouvez les utiliser dans tout le projet utilisant la classe NSObject.
- (void)requestWithUrlString:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure {
[self requestWithUrl:stUrl parmeters:parameters success:^(NSDictionary *response) {
if([[response objectForKey:@"success"] boolValue]) {
if(success) {
success(response);
}
}
else {
NSError *error = [NSError errorWithDomain:@"Error" code:kDefaultErrorCode userInfo:@{NSLocalizedDescriptionKey:[response objectForKey:@"message"]}];
if(failure) {
failure(error);
}
}
} failure:^(NSError *error) {
if(failure) {
failure(error);
}
}];}
et // Définir les en-têtes dans la méthode inférieure (si nécessaire, supprimer).
- (void)requestWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *))failure {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
[manager.requestSerializer setValue:@"WWSE profile=\"UsernameToken\"" forHTTPHeaderField:@"Authorization"];
[manager GET:stUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
if([responseObject isKindOfClass:[NSDictionary class]]) {
if(success) {
success(responseObject);
}
}
else {
NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
if(success) {
success(response);
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
if(failure) {
failure(error);
}
}];}
Pour tous les problèmes et plus de détails s'il vous plaît visitez..AFNetworking
Une solution consiste à utiliser NSURLConnection sendSynchronousRequest:returningResponse:error:
( docs ). Dans le gestionnaire d'achèvement, vous aurez TOUTES les données de réponse, pas seulement les données partielles que vous obtenez dans la méthode connection:didReceiveData:
du délégué.
Si vous souhaitez continuer à utiliser le délégué, vous devez suivre les conseils donnés dans Documents Apple :
Le délégué doit concaténer le contenu de chaque objet de données Fourni pour constituer l'ensemble des données d'un chargement d'URL.