Bonjour, je suis nouveau dans iOS et j'essaie d'obtenir une réponse du service Web à l'aide de JSON, mais l'erreur suivante se produit. S'il vous plaît aidez-moi à le résoudre.
Error Domain = NSCocoaErrorDomain Code = 3840 "L'opération n'a pas pu être complétée Terminée. (Erreur Cocoa 3840.)" (Le texte JSON n'a pas commencé avec array ou Object et l'option permettant d'autoriser les fragments non définis.) UserInfo = 0x7fd30bee0f70 {NSDebugDescription = Le texte JSON n'a pas commencé avec un tableau ou un objet et option pour autoriser les fragments non définis., NSUnderlyingError = 0x7fd30bede7b0 "Échec de la demande: erreur de serveur interne (500)"}}
-(void)loadFeedWithOffset:(NSInteger)Offset Limit:(NSInteger)Limit
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// [manager.requestSerializer setValue:@"application/json; text/html" forHTTPHeaderField:@"Accept"];
// [manager.requestSerializer setValue:@"application/json; text/html; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"UID"] forKey:@"user_id"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Offset] forKey:@"offset"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Limit] forKey:@"limit"];
[params setValue:[NSString stringWithFormat:@"%d",[AppDelegate sharedAppDelegate].intPostType] forKey:@"post_type"];
[manager POST:[NSString stringWithFormat:@"%@webservices/post/load", API_URL] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
if ([[responseObject objectForKey:@"status"] isEqualToString:@"fail"])
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:[responseObject objectForKey:@"message"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
}
else
{
if ([[responseObject objectForKey:@"feed"] count] > 0)
{
isOver = FALSE;
[arrFeed addObjectsFromArray:[responseObject objectForKey:@"feed"]];
searchedDataArray = [NSMutableArray arrayWithArray:arrFeed];
//searchedDataArray=arrFeed;
[tblMenuDetail reloadData];
}
else
{
isOver = TRUE;
}
[self performSelector:@selector(doneLoadingTableViewData) withObject:self afterDelay:1.0];
}
[[AppDelegate sharedAppDelegate] hideProgress];
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
[[AppDelegate sharedAppDelegate] hideProgress];
NSLog(@"Error: %@", error);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
}];
}
Il s’agit généralement d’un problème d’arrière-plan, le json n’est pas bien formulé et vous ne pouvez rien y faire du côté client ....
Bien que cela se produise parfois lorsque des paramètres incorrects sont envoyés au back-end, vous pouvez donc vérifier si tous les paramètres sont corrects (type et valeur)
J'avais le même problème avec AFNetworking, car votre réponse provenant du serveur contient une chaîne et non un dictionnaire JSON ou un tableau. Donc je l'ai corrigé en ajoutant la ligne de code ci-dessous
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
J'espère que cela fonctionnera pour vous aussi. Bonne chance:)
Essayez de définir le content-type
comme json
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
Ce n'est pas JSONSerialization
ou erreur Swift.
Le problème provient de l'analyse de la réponse. Vous essayez de désérialiser une réponse JSON (qui DOIT être contenue dans un Array
ou un Dictionary
), mais votre réponse ne correspond à rien de ce qui précède (très probablement une simple chaîne).
essayez ce code pour imprimer les données de notre serveur afin d'identifier facilement l'erreur et de le résoudre.
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let jsonData = data {
do {
let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: .mutableLeaves) as! [String: AnyObject]
}
catch let err{
print("\n\n===========Error===========")
print("Error Code: \(error!._code)")
print("Error Messsage: \(error!.localizedDescription)")
if let data = data, let str = String(data: data, encoding: String.Encoding.utf8){
print("Print Server data:- " + str)
}
debugPrint(error)
print("===========================\n\n")
debugPrint(err)
}
}
else {
debugPrint(error as Any)
}
}.resume()
J'ai également ce problème, mais si vous voulez vous assurer qu'il s'agit du serveur ou du serveur, essayez de toucher le service Web avec postman et vérifiez la réponse dans la section Raw ou dans la section Preview. Ces sections montrent la réponse exacte obtenue via un service Web. Les sections de prévisualisation affichent des informations/problèmes exacts tels que la ligne no, le nom de la fonction, etc.
J'ai le même problème, je reçois une réponse chiffrée du serveur, ce que j'ai fait résout le problème.
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
Essaie.
Dans mon cas, j'ai défini les options .jsonobject: as array, c'est pourquoi je reçois cette erreur.
let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject]
C’est mon code ici j’envoie [] _ pour les options, puis j’ai changé de tableau à .allowFragments
Ma solution est ..
let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
Voici la solution, utilisez le code ci-dessous et cela fonctionnera:
// Remarque: service Web utilisant JSON
NSString *strAPIURL = [NSString stringWithFormat:@"%@webservices/post/load", API_URL];
NSDictionary* dictHeader = @{@"content-type": @"application/json"}; //You can add here more header field if require, like "Authorization"
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"UID"] forKey:@"user_id"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Offset] forKey:@"offset"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Limit] forKey:@"limit"];
[params setValue:[NSString stringWithFormat:@"%d",[AppDelegate sharedAppDelegate].intPostType] forKey:@"post_type"];
NSData *postData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strAPIURL]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
[request setHTTPMethod:@“POST”];
[request setAllHTTPHeaderFields:dictHeader];
[request setHTTPBody:postData];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
//Success code…
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//Failure code…
}];
[operation start];
return operation;