JSON文本不以数组或对象和选项开头,以允许未设置片段

时间:2015-11-27 06:27:01

标签: ios objective-c json web-services

您好,我是iOS的新手,我正在尝试使用JSON从Web服务获得响应,但发生以下错误。请帮我解决一下。

  

错误域= NSCocoaErrorDomain代码= 3840"操作不能   完成。 (可可误差3840。)" (JSON文本不是从数组开始的   允许片段未设置的对象和选项。)UserInfo = 0x7fd30bee0f70   {NSDebugDescription = JSON文本不是以数组或对象开头的   允许片段未设置的选项。,NSUnderlyingError = 0x7fd30bede7b0   "请求失败:内部服务器错误(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;
 }];
}

9 个答案:

答案 0 :(得分:8)

这通常是一个与后端相关的问题,json格式不合理,在客户端没有什么可以做的....

虽然有时会在向后端发送错误参数时发生这种情况,因此您可以检查所有参数是否正确(类型和值)

答案 1 :(得分:2)

尝试将content-type设为json

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

答案 2 :(得分:2)

我遇到了与AFNetworking相同的问题,这是因为你来自服务器的响应是持有字符串而不是JSON字典或数组。所以我通过添加以下代码行来修复它

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

希望它也适合你。一切顺利:)

答案 3 :(得分:0)

这是解决方案,使用下面的代码,它将起作用:

  

//注意:使用JSON的Web服务

addEvent(){
this.buttonColor = '#345465'; //desired Color

/*
YOUR FUNCTION CODE
*/

}

答案 4 :(得分:0)

我遇到了同样的问题,我从服务器获得加密响应,我所做的解决了这个问题。

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

试一试。

答案 5 :(得分:0)

我也有这个问题,但如果您想确保此问题来自服务器端或后端,请尝试使用邮递员点击Web服务并检查Raw部分或预览部分中的响应。这些部分显示了我们使用Web服务获得的确切响应。预览部分显示确切的信息/问题,如行号,功能名称等。

答案 6 :(得分:0)

这不是JSONSerialization或快速错误。

问题来自响应解析。您正在尝试反序列化JSON响应(必须包含在ArrayDictionary中)但是您的响应不是上述(很可能是一个简单的字符串)。

尝试使用此代码打印出我们的服务器数据,以便轻松识别错误并解决此问题。

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

答案 7 :(得分:0)

在我的情况下,我将.jsonobject选项设置为: array ,这就是为什么我遇到此错误的原因。

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

这是我的代码,我向其中发送 [] 作为选项,后来我从 array更改为.allowFragments

我的解决方法是。

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

答案 8 :(得分:0)

如果您的网址不够错误,无法使api返回错误或错误的响应,但是错误中包含了api不喜欢的内容,则也会发生此错误。例如:

示例1: appendingPathExtension(“。json”)可能会增加一个多余的“ ..”时期,因为此方法已经为您添加了'。

示例2: 通过使用除URLQueryItem Class和.queryItems方法以外的方法将查询添加为url / string来构造url。在Swift 5中,这可能会导致“?”在您要求使用其他符号的情况下,或者让api一起丢失了apiKey或queryItem。所以在任何地方看到“?”在示例请求网址中,请确保使用queryItems(请参阅文档)。

这是成功构建URL的一个示例,其中包括一个查询项,该查询项的最后是api_key ...

    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