Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON text did not start with array or object and option to allow fragments not set

Hi I am new in iOS and I am trying to get response from web-service using JSON but following error occurs. Please help me to solve it.

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x7fd30bee0f70 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set., NSUnderlyingError=0x7fd30bede7b0 "Request failed: internal server error (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;
 }];
}
like image 659
Birendra Avatar asked Nov 27 '15 06:11

Birendra


4 Answers

This is usually a back-end related issue, the json is not well formated and there is nothing you can do about it on client side ....

Although sometimes this occurs when wrong parameters are sent to back-end, so you could check if all parameters are correct (both type and value)

like image 98
edo Avatar answered Nov 17 '22 08:11

edo


This is not JSONSerialization or swift error.

The problem comes from response parsing. You are trying to de-serialize a JSON response (which MUST be contained in either a Array or Dictionary) however your response is none of the above (Most likely a simple string).

try this code to print out our server data to easily identifying to error and resolve this.

URLSession.shared.dataTask(with: url) { (data, response, error) in

    if let jsonData = data {
        do {
            let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: []) 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()
like image 21
AshvinGudaliya Avatar answered Oct 19 '22 20:10

AshvinGudaliya


I was having same problem with AFNetworking, this is because your response coming from server is holding string and not JSON Dictionary or Array. So i fixed it by adding below line of code

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

Hope it may work for you too. All the best:)

like image 3
Satyendra Pandey Avatar answered Nov 17 '22 06:11

Satyendra Pandey


Try setting the content-type as json

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

like image 2
Sreejith Avatar answered Nov 17 '22 06:11

Sreejith