我的 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);
编辑:
不要简单地忽略error
和response
对象,而是使用它们来诊断问题:
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.
。所以下载有问题。我建议查看error
和response
对象,而不是简单地忽略它们。
我放了你写的代码,但我没有任何关于错误的 nslog,它只是给我发送 responseData ;)以上是关于我的 JSONObjectWithData 为空的主要内容,如果未能解决你的问题,请参考以下文章
nsjsonserialization.jsonobjectwithdata 截断接收到的数据
NSJSONSerialization JSONObjectWithData:options:error: 编码问题
Swift 2 - NSJSONSerialization.JSONObjectWithData 处理错误 [重复]
调用 JSONSerialization.JSONObjectWithData 时调用中的额外参数 [重复]