错误发生反序列化JSON数据(ERROR happened while deserializing

2019-10-18 06:38发布

-(void) conn:(NSString *)method{

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
    __block NSDictionary *resultBlock = nil;
    dispatch_sync(concurrentQueue, ^{
        /* Download the json here */

        //Create webservice address
        NSString *webService = [_baseURL stringByAppendingString:_webService];
        //NSLog(@"%@", webService);
        //Create error object
        NSError *downloadError = nil;

        //Create the request
        NSMutableURLRequest *req = [self initRequest:webService method:method];

        if(req != nil){
            //Request the json data from the server
            NSData *jsonData = [NSURLConnection
                                    sendSynchronousRequest:req
                                    returningResponse:nil
                                    error:&downloadError];

            if(downloadError!=nil){
                NSLog(@"DOWNLOAD ERROR %@", downloadError);
            }

            NSError *error = nil;
            id jsonObject = nil;

            if(jsonData !=nil){

                /* Now try to deserialize the JSON object into a dictionary */
                jsonObject = [NSJSONSerialization
                                 JSONObjectWithData:jsonData
                                 options:kNilOptions
                                 error: &error];
            }


            //Handel the deserialized object data
            if (jsonObject != nil && error == nil){
                NSLog(@"Successfully deserialized...");
                if ([jsonObject isKindOfClass:[NSDictionary class]]){
                    resultBlock = (NSDictionary *)jsonObject;
                    //NSLog(@"Deserialized JSON Dictionary = %@", resultBlock);
                }
                else if ([jsonObject isKindOfClass:[NSArray class]]){
                    NSArray *deserializedArray = (NSArray *)jsonObject;
                    NSLog(@"Deserialized JSON Array = %@", deserializedArray);
                } else {
                    /* Some other object was returned. We don't know how to deal
                     with this situation, as the deserializer returns only dictionaries
                     or arrays */
                }
            }
            else if (error != nil){
                NSLog(@"An error happened while deserializing the JSON data. %@", error);
            }else{
                NSLog(@"No data could get downloaded from the URL.");
                //[self conn:method];
            }
        }
    });
    dispatch_sync(dispatch_get_main_queue(), ^{

        /* Check if the resultBlock is not nil*/
        if(resultBlock != nil){
            /*Set the value of result. This will notify the observer*/
            [self setResult:resultBlock];
        }
    });
});
}

为什么我会收到以下错误?

反序列化JSON数据发生错误。 误差区域= NSCocoaErrorDomain代码= 3840“该操作不能完成。(可可错误3840)”(JSON文本不与阵列或对象和选项,允许片段未设置启动。)的UserInfo = 0x20839f80 {NSDebugDescription = JSON文本不与阵列或对象和选项启动以允许片段未设置。}

当我将其更改为

  /* Now try to deserialize the JSON object into a dictionary */
                jsonObject = [NSJSONSerialization
                                 JSONObjectWithData:jsonData
                                 options:NSJSONReadingAllowFragments
                                 error: &error];
            }

我得到以下错误:

反序列化JSON数据发生错误。 误差区域= NSCocoaErrorDomain代码= 3840“该操作不能完成。(可可错误3840)”的UserInfo = 0x20888760(约0字符的值无效){NSDebugDescription =无效值周围字符0}

我改变了我的连接从LTE到WiFi,现在我得到504错误和的NSLog(@“没有任何数据可以得到从URL下载”);

Answer 1:

你应该先修复代码中的这些问题:

  1. 适当地检查错误,在其中一个提供一个指针指向一个参考方法NSError对象作为最后一个参数,例如: - (BOOL) doSomething:(NSError**)error ,或-(NSData*) doSomething:(NSError**)error

    为了测试一个错误正确,你检查方法的返回值 。 这些方法表明有“特殊返回值”的错误条件。 例如,他们返回NOnil - 一如既往的文档中指定。 只有在方法指示错误,所提供的误差参数包含一个有意义的值-即,它指向一个NSError由该方法创建的对象。 注意,这个参数也可以成为没有空当方法成功,其中有没有“意义”的情况。

  2. Web服务通常可以提供所请求的资源的几种格式。 如果不指定要在服务器编码资源的格式,你会得到一个默认的格式-这不一定是JSON。

    为了更明确一些资源的所期望的格式,设置一个相应的“接收”报头。 例如,如果你想在JSON,您需要设置标题格式为: "Accept: application/json"在您的要求。

  3. Web服务可能具有的理由不与您所请求的资源响应。 为了确保你得到了你请求的响应,你需要检查状态代码和MIME类型的响应,以确保您实际收到的JSON响应。

  4. 看来,你是一个有点不确定有关如何使用调度功能,你的优势。 如果您使用的同步方便的方法sendSynchronousRequest:...你肯定需要将其包装在只有一个dispatch_async功能。 然后,如果您想设置在主线程的结果,你一定要使用dispatch_async ,不dispatch_sync。

    然而,这将是一个进步,如果你会使用sendAsynchronousRequest:...代替。 只有当你将使用NSURLConnection异步模式和实施NSURLConnection委托方法-我强烈推荐-实际上会成为伟大的;)

所以,我认为,一旦你定你的代码,你可以自己回答原来的问题,或从服务器获取更好的错误响应,或错误奇迹般地消失了;)



文章来源: ERROR happened while deserializing the JSON data