wake-up-neo.net

JSON-Text begann nicht mit Array oder Objekt und Option, um Fragmente nicht zulassen zu lassen

Hallo, ich bin neu in iOS und versuche, mithilfe von JSON eine Antwort vom Web-Service zu erhalten, aber der folgende Fehler tritt auf. Bitte hilf mir, es zu lösen.

Fehler Domain = NSCocoaErrorDomain Code = 3840 "Die Operation konnte nicht abgeschlossen werden Abgeschlossen. (Cocoa-Fehler 3840.)" (JSON-Text begann nicht mit Array oder Objekt und Option, um Fragmente nicht zulassen zu lassen.) UserInfo = 0x7fd30bee0f70 {NSDebugDescription = JSON-Text begann nicht mit Array oder Objekt und Option, um nicht gesetzte Fragmente zuzulassen., NSUnderlyingError = 0x7fd30bede7b0 "Anforderung fehlgeschlagen: interner Serverfehler (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

Dies ist in der Regel ein Backend-Problem, der Json ist nicht gut formatiert und es gibt nichts, was Sie auf der Clientseite tun können.

Dies geschieht manchmal, wenn falsche Parameter an das Back-End gesendet werden. Sie können also prüfen, ob alle Parameter korrekt sind (sowohl Typ als auch Wert).

8
edo

Ich hatte dasselbe Problem mit AFNetworking. Dies liegt daran, dass Ihre Antwort vom Server Zeichenfolge enthält und nicht das JSON-Wörterbuch oder -Array. Also habe ich das Problem behoben, indem ich die folgende Codezeile hinzugefügt habe 

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

Ich hoffe, es kann auch für Sie funktionieren. Alles Gute:)

2

Setzen Sie den content-type als json

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

2
Sreejith

Dieser Fehler kann auch auftreten, wenn Ihre URL nicht fehlerhaft genug ist, um die API zu veranlassen, einen Fehler oder eine schlechte Antwort zurückzugeben, aber Fehler aufweist, die etwas Merkwürdiges enthalten, das die API nicht mochte. Zum Beispiel:

beispiel 1: appendingPathExtension (". json") könnte einen zusätzlichen unerwünschten ".." Punkt hinzufügen, da diese Methode BEREITS den Punkt für Sie hinzufügt.

beispiel 2: Die URL wurde erstellt, indem die Abfrage als URL/Zeichenfolge über eine andere Methode als die URLQueryItem-Klasse und die .queryItems-Methode hinzugefügt wurde. In Swift 5 kann dies dazu führen, dass ein "?" In Ihrer Anfrage ein anderes Symbol darstellt oder dass die API Ihren apiKey oder Ihr queryItem insgesamt verfehlt. Sie sehen also überall "?" In Ihrer Beispielanfrage Stellen Sie sicher, dass Sie queryItems verwenden (siehe Dokumentation).

Hier ist ein Beispiel für eine erfolgreiche URL-Erstellung, einschließlich eines einzelnen Abfrageelements, das der api_key am Ende ist ...

    let heirarchyURL = baseURL.appendingPathComponent("league").appendingPathComponent("hierarchy").appendingPathExtension("json")

    var components = URLComponents(url: heirarchyURL, resolvingAgainstBaseURL: true)

    let keyQuery = URLQueryItem(name: "api_key", value: apiKey)

    components?.queryItems = [keyQuery]

    guard let url = components?.url else {
        NSLog("components of url failed to load properly")
        completion()
        return
    }

    print("fetch URL: \n\(url)\n")

    let request = URLRequest(url: url)

    URLSession.shared.dataTask(with: request) { (data, _, error) -> Void in
0
John Pitts

Dies ist kein JSONSerialization- oder Swift-Fehler.

Das Problem ergibt sich aus der Antwortanalyse. Sie versuchen, eine JSON-Antwort zu deserialisieren (die MUSS in einer Array oder Dictionary enthalten sein). Ihre Antwort ist jedoch keine der oben genannten (höchstwahrscheinlich eine einfache Zeichenfolge).

versuchen Sie es mit diesem Code, um unsere Serverdaten auszudrucken, um Fehler leicht zu identifizieren und zu beheben.

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

Ich habe auch dieses Problem, aber wenn Sie sicherstellen möchten, dass es sich um ein Server- oder Back-End-Problem handelt, versuchen Sie, den Webdienst mit dem Postman zu treffen, und überprüfen Sie die Antwort entweder im Raw-Abschnitt oder im Vorschau-Abschnitt. Diese Abschnitte zeigen die genaue Antwort, die wir über den Webdienst erhalten. Vorschaubereiche zeigen genaue Informationen/Ausgaben wie Zeilennummer, Funktionsname usw.

0
Ajju

Ich habe das gleiche Problem, ich bekomme eine verschlüsselte Antwort vom Server. Was ich tat, löst das Problem.

manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Versuche es.

0
AsimRazaKhan

In meinem Fall setze ich .jsonobject Optionen: als array , deshalb bekomme ich diesen Fehler.

let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject]

Dies ist mein Code hier, den ich [] für Optionen sende, später habe ich von Array zu .allowFragments gewechselt.

Meine Lösung ist ..

let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
0
iOS

Hier ist Lösung, Verwenden Sie den folgenden Code und es wird funktionieren:

// Hinweis: Webdienst mit 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