web-dev-qa-db-fra.com

Le texte JSON ne commence pas par un tableau ou un objet, et l'option permettant aux fragments de ne pas être définis

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;
 }];
}
8
Birendra

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)

8
edo

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:)

2
Satyendra Pandey

Essayez de définir le content-type comme json 

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; 

2
Sreejith

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()
0
AshvinGudaliya

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.

0
Ajju

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.

0
AsimRazaKhan

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]
0
iOS

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