为 iphone 解析 json 时获取空值?

Posted

技术标签:

【中文标题】为 iphone 解析 json 时获取空值?【英文标题】:Getting null while parsing json for iphone? 【发布时间】:2013-12-18 14:41:25 【问题描述】:

我正在尝试在这里解析 JSON 并执行一些操作。我在字符串中得到响应,如下所示,为什么 json 返回 null,

    NSError *error = [[NSError alloc] init];
    NSHTTPURLResponse *response = nil;
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    NSLog(@"Response code: %d", [response statusCode]);
    if ([response statusCode] >=200 && [response statusCode] <300)
    
        NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
        NSLog(@"Response ==> %@", responseData);

我正在这里收到回复...

响应 ==> "success":1"tag":"login","success":1,"error":0

如果响应可以以字符串形式出现,为什么它不会出现在下面的代码中?我们可以在下面的代码中获取成功函数/变量或将字符串传递给jsonData...

 NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:urlData options:NSJSONReadingMutableLeaves error:nil];
                          NSLog(@"json data is %@",jsonData);
            NSInteger success = [(NSNumber *) [jsonData objectForKey:@"success"] integerValue];
            NSLog(@"%d",success);

        if(success == 1)
        
            NSLog(@"Login SUCCESS");
            [self alertStatus:@"Logged in Successfully." :@"Login Success!"];
                   ColorPickerViewController *cpvc =[[ColorPickerViewController alloc] init];
                   [self.navigationController pushViewController:cpvc animated:YES];

         else 

            NSString *error_msg = (NSString *) [jsonData objectForKey:@"error_message"];
            [self alertStatus:error_msg :@"Login Failed!"];
        

每次我运行它都会执行 else 块...

当我尝试解析 Json 时,它正在重新调整我的空值

2013-12-18 07:52:09.193 ColorPicker[15867:c07] json 数据为 (null) 2013-12-18 07:52:09.193 ColorPicker[15867:c07] 0

我在这里发送来自 json 的响应

 // Get tag
   $tag = $_POST['tag'];

   // Include Database handler
   require_once 'include/DB_Functions.php';
   $db = new DB_Functions();
   // response Array
   $response = array("tag" => $tag, "success" => 0, "error" => 0);

   // check for tag type
   if ($tag == 'login') 
       // Request type is check Login
       $email = $_POST['email'];
       $password = $_POST['password'];

       // check for user
       $user = $db->getUserByEmailAndPassword($email, $password);
       if ($user != false) 
           // user found

           // echo json with success = 1
           $response["success"] = 1;
           $response["user"]["fname"] = $user["firstname"];
           $response["user"]["lname"] = $user["lastname"];
           $response["user"]["email"] = $user["email"];
   $response["user"]["uname"] = $user["username"];
           $response["user"]["uid"] = $user["unique_id"];
           $response["user"]["created_at"] = $user["created_at"];

           echo json_encode($response);
        else 
           // user not found
           // echo json with error = 1
           $response["error"] = 1;
           $response["error_msg"] = "Incorrect email or password!";
           echo json_encode($response);
       
   

我有几乎相同的 web 服务用于注册标签注册,并且使用相同的代码可以正常工作:O

【问题讨论】:

JSONObjectWithData:方法中传递NSError并打印错误并找出它返回null的原因 我认为这不是一个有效的 json @MidhunMP 正是我现在认为的。我也不认为它是一个有效的 json。 @Quick App 我认为您可以将该 urlData 作为字符串分配给 NSDictionary 并获取键“成功”的值并使用它。 【参考方案1】:

此回复:

响应 ==> "success":1"tag":"login","success":1,"error":0

似乎有两个有效的 json 字符串:

“成功”:1 和 "tag":"login","success":1,"error":0

所以,您的 php 代码可能在两个地方写出 json。调试脚本, 例如,通过为成功设置不同的值(两个 json 字符串中的公共键), 应该有助于确定它。

【讨论】:

【参考方案2】:

如果您的 jsonData 为零。尝试这样解析

如果是数组,你的响应应该是这样的:

Response : ["success":1,"tag":"login","success":1,"error":0]

如果是字典,那么响应应该是

Response : "tag":"login","success":1,"error":0

然后替换这个

    NSDictionary * jsonData = [NSJSONSerialization JSONObjectWithData:urlData options:kNilOptions error:&error];


    NSInteger success = [(NSNumber *) [jsonData objectForKey:@"success"] integerValue];

    NSInteger success = [[jsonData objectForKey:@"success"] integerValue];

    NSInteger success = [[jsonData valueForKey:@"success"] integerValue];

    NSInteger success = [jsonData[@"success"] integerValue];

【讨论】:

当我打印时它为空的 jsonData 怎么样? 它应该先执行jsonData,jsonData为null它应该返回一些值,然后下一条语句将被正确执行lu 你说你的回应即将到来。 NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:urlData options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"json 数据为 %@",jsonData);返回空 那么正确的格式应该是什么?我认为 echo json_encode($response);没问题

以上是关于为 iphone 解析 json 时获取空值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 swiftyJSON 在 Swift 2.0 中解析 JSON 时获取空值

解析foursquare为iPhone返回的json给出了无法识别的主角

使 iPhone 能够获取和解析 JSON?

如何在 kotlin 中通过 GSON lib 解析 JSON 时管理 android 应用程序的空值

在android中获取json时控制空值

json_decode 从 iOS 应用程序返回空值