我的 JSONObjectWithData 为空

Posted

技术标签:

【中文标题】我的 JSONObjectWithData 为空【英文标题】:My JSONObjectWithData is null 【发布时间】:2014-11-28 09:47:32 【问题描述】:

我的 JSON 有问题,它向我发送了一个空值。

我认为我在 php 中的 web 服务没有问题,因为我的 PhP 专家同事没有发现任何错误

就在我的 Obj-C 代码下面

dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NULL);

        dispatch_async(downloadQueue, ^
            NSData *result = self.envoyerLaDemande;
            dispatch_async(dispatch_get_main_queue(), ^

                id strResult=nil;

                strResult = [NSJSONSerialization JSONObjectWithData:result options:0 error:nil];

                NSLog(@"strResult: %@", strResult);

                NSString* boolOk=[strResult objectForKey:@"result"];
                NSLog(@"BoolOk: %@", boolOk);

还有 PHP 脚本

$data = array();

if(condition == 1)

$data["result"] = "ok";

else

$data["result"] = "error";

$data["result"] = "coucou";

echo json_encode($data);

还有方法特使拉德曼德

-(NSData*)envoyerLaDemande


NSURL *url = [NSURL URLWithString:@"http://mywebsite.com.com/App/V2/mailTo.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

NSString* requestFields;


requestFields = [NSString stringWithFormat:@"agence=%@&", nomAgence];

request.HTTPBody = requestData;
request.HTTPMethod = @"POST";

NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error == nil && response.statusCode == 200) 
 else 

return responseData;


【问题讨论】:

self.envoyerLaDemande 长什么样子? @Batman 请提供更多信息。 @Rick self.envoyerLaDemande 是我调用网络服务时的方法,我编辑我的帖子 @learner 我已经编辑了我的帖子 @Batman 在 postman 上使用 chrome add 来确认您的服务正常工作并使用 NSURLConnectionDataDelegate 方法(didReceiveData ,didFailWithError ) ,通过断点查看流程。 【参考方案1】:

问题是你在做两个dispacth_async

在第一个中,您告诉操作系统“在后台执行此代码”,这将开始在后台加载请求。但是,紧随该代码之后,您会告诉操作系统在主线程上执行一段代码。这段代码访问了尚未设置的result 变量,因为它仍在后台加载。

如果您坚持使用这些调度,只需将调度移回主队列即可。但是,请考虑查看NSURLConnectionDataDelegate 或至少在您的NSURLConnection 上使用sendAsynchronousRequest:queue:completionHandler 方法。

此代码应该适用于您当前的场景。

dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NULL);

dispatch_async(downloadQueue, ^
    NSData *result = self.envoyerLaDemande;
    id strResult=nil;
    strResult = [NSJSONSerialization JSONObjectWithData:result options:0 error:nil];
    NSLog(@"strResult: %@", strResult);
    NSString* boolOk=[strResult objectForKey:@"result"];
    NSLog(@"BoolOk: %@", boolOk);

编辑:

不要简单地忽略errorresponse 对象,而是使用它们来诊断问题:

NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error == nil && response.statusCode == 200) 
    return responseData;
 else 
    NSLog(@"Error. Status code: %d Error message: %@", response.statusCode, error.localizedDescription);
    return nil;

【讨论】:

感谢您的回答,但还是不行,问题依旧 result 也是 nil 吗?如果是这样,那么问题可能在于与服务器的通信。 是的,结果也为零。与服务器通信?除非我希望网络服务执行的操作很好,但它不会向我发送返回值 查看 sendSynchronousRequest 的文档。它说Returns nil if a connection could not be created or if the download fails.。所以下载有问题。我建议查看errorresponse 对象,而不是简单地忽略它们。 我放了你写的代码,但我没有任何关于错误的 nslog,它只是给我发送 responseData ;)

以上是关于我的 JSONObjectWithData 为空的主要内容,如果未能解决你的问题,请参考以下文章

nsjsonserialization.jsonobjectwithdata 截断接收到的数据

NSJSONSerialization JSONObjectWithData:options:error: 编码问题

Swift 2 - NSJSONSerialization.JSONObjectWithData 处理错误 [重复]

调用 JSONSerialization.JSONObjectWithData 时调用中的额外参数 [重复]

JSONObjectWithData方法里options參数选择解释

NSJSONSerialization JSONObjectWithData 其中数据包含换行符