2017-07-21 1 views
0

Utilisation de AFNetworking impossible d'obtenir les données du serveur.Problème avec l'analyse JSON avec AFNetworking?

voici mon code certains,

NSString *serviceUrl = [NSString stringWithFormat:@"%@%@", BASE_URL,serviceName]; 
NSString *paramString = [NSString stringWithFormat:SERVICE_PARAMS, parametersString, DB_NAME]; 
NSData* data = [paramString dataUsingEncoding:NSUTF8StringEncoding]; 
NSError *error; 
NSDictionary *parametersDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
NSString *postLength = [NSString stringWithFormat:@"%ld", [data length]]; 
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
[manager.requestSerializer setTimeoutInterval:SERVICE_TIMEOUT]; 
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
[manager.requestSerializer setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
manager POST:serviceUrl parameters:parametersDictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    if (self.delegate) { 
     [self.delegate onServiceSuccess:(NSDictionary *)responseObject]; 
    } 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    if (self.delegate) { 
     [self.delegate onServiceFailed]; 
    } 
}]; 

Je reçois une réponse comme ça, < 5b5b7b22 636f756e 74223a22 30227d5d 5j> mais ma réponse réelle fonctionne bien dans Postman. ici est le facteur écran enter image description here

+1

Vous avez utilisé 'AFHTTPResponseSerializer', donc l'objet de réponse est de classe' NSData'. Vous pouvez vous utiliser 'NSArray * myJSONArray = [NSJSONSerialization JSONObjectWithData: options de responseObject: 0 error: nil];', ou changer le 'AFHTTPResponseSerializer' et utiliser le' AFJSONResponseSerializer' (ou quelque chose comme ça, pas sûr du vrai nom), qui fera la désérialisation pour vous. – Larme

+1

En outre, notez que, même sérialisé, votre réponse JSON est un NSArray, pas un NSDictionary (comme vous semblez l'avoir casté). Vous pouvez vouloir faire '[self.delegate onServiceSuccess: myJSONObjectResponseArray [0] [0]]' – Larme

Répondre

0

Vous utilisez AFHTTPResponseSerializer (réponse par défaut sérialiseur), donc responseObject est un objet NSData (<5b5b7b22 636f756e 74223a22 30227d5d 5d> est le description de base d'un objet NSData).

Vous pouvez remplacer AFHTTPResponseSerializer avec le JSON un correspondant: AFJSONResponseSerializer, ou faire la sérialisation vous:

NSArray *myJSONArray = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil]; 

Notez que votre JSON est un tableau de tableaux de dictionnaires. Donc, ce faisant: [self.delegate onServiceSuccess:(NSDictionary *)responseObject]; est juste un casting, et un mauvais. Si vous voulez vraiment juste {"count":"96"}, faites [self.delegate onServiceSuccess:myJSONObjectResponseArray[0][0]]; à la place.

+0

fonctionne très bien. Je change le dictionnaire en tableau. –