如何在 JsonObject 中获取值

Posted

技术标签:

【中文标题】如何在 JsonObject 中获取值【英文标题】:how to get value inside JsonObject 【发布时间】:2021-03-30 19:38:30 【问题描述】:

我正在尝试这种新方法 Ion。使用 PDO,我被困在想要在 JsonObject 中获得价值的地方。我以前将 Volly 与 msqli 一起使用,但我找到了 Ion。更有条理,PDO 更安全。

每当我尝试向 java 添加任何代码时,它都会中断并且无法正常工作,就好像没有与 php 相同的连接,所以我被卡住了

我被困在的部分是 LOG_IN_SUCCESS,因为我需要获取会话管理器的用户 ID,因为 $row 在 java 中仅显示“LOG_IN_SUCCESS”的情况 我还添加了 case"LOG_IN_SUCCESS": case"0":code break; 但我没有工作

我尝试为 case“0”添加新字符串,其中包含用户 ID,但代码刚刚中断

java

      private void loginbtn(final String email, final String password) 


    Ion.with(getApplicationContext())
            .load(HOST)
            .setBodyParameter("susers_semails", email)
            .setBodyParameter("susers_spasswords", password)
            .asJsonObject()
            .setCallback(new FutureCallback<JsonObject>() 
                @Override
                public void onCompleted(Exception e, JsonObject result) 

                    try 

                        String completed = result.get("LOGIN").getAsString();

                        switch (completed)

                            case "Email_Doesnt_Exist":
                                edtemail.setError("Email Doesnt Exist");
                                loginbtn.setVisibility(View.VISIBLE);
                                progressBar.setVisibility(View.GONE);
                                break;

                            case "Log_In_Success":


                                    Intent intent = new Intent(LoginActivity.this, HomeSearchActivity.class);
                                    startActivity(intent);
                                    finish();
                                    loginbtn.setVisibility(View.VISIBLE);
                                    progressBar.setVisibility(View.GONE);
                                    Toast.makeText(LoginActivity.this, completed, Toast.LENGTH_LONG);
                                    Log.d(TAG, "onCompleted: " + completed);
                                break;





                            case "Log_In_Failed":
                                edtpassword.setError("Incorrect Password");
                                loginbtn.setVisibility(View.VISIBLE);
                                progressBar.setVisibility(View.GONE);

                                break;

                            default:
                                Toast.makeText(getApplicationContext(), "Ops! Error Occurred m", Toast.LENGTH_LONG).show();
                                loginbtn.setVisibility(View.VISIBLE);
                                progressBar.setVisibility(View.GONE);

                                break;

                        
                    catch (Exception error)
                        Toast.makeText(getApplicationContext(), "Please Check Connection And Try Again", Toast.LENGTH_LONG).show();
                        loginbtn.setVisibility(View.VISIBLE);
                        progressBar.setVisibility(View.GONE);


                    

                
            );



php

   $susers_semails = $_POST['susers_semails'];
   $susers_spasswords = $_POST['susers_spasswords'];

   

   $stmt = $PDO->prepare("SELECT susers_sids,susers_semails,susers_spasswords FROM userstbl WHERE 
   susers_semails = :USER_EMAIL" );

   $stmt->bindParam(':USER_EMAIL',$susers_semails);
   $stmt->execute();
   $row = $stmt->fetch(PDO::FETCH_ASSOC); 
   

   if (!empty($row)) 

   if (password_verify($susers_spasswords, $row['susers_spasswords'])) 

     $returnApp = array( 'LOGIN' => 'Log_In_Success',$row);
     echo json_encode($returnApp);

     
    else 
    
     $returnApp = array( 'LOGIN' => 'Log_In_Failed');
     echo json_encode($returnApp);
    

    else 

     $returnApp = array( 'LOGIN' => 'Email_Doesnt_Exist');
     echo json_encode($returnApp);

  

JSON

  
  0: 
  susers_sids: "3"
  ,
  LOGIN: "Log_In_Success" 
  

【问题讨论】:

String completed = result[0].LOGIN; ? @LouysPatriceBessette 但结果不是数组??? 您可以使用方括号访问对象属性。这并不意味着它是一个数组。 $row 成为对象 $returnApp 的属性作为一个数组。我认为您尝试仅传递 suser_sids 所以它应该类似于 array( 'LOGIN' =&gt; 'Log_In_Success', 'susers_sids' =&gt; $row['susers_sids']); 以返回 LOGIN: "Log_In_Success" , susers_sids: "3", 或者您可以使用 array_merge_recursive。 @LouisLoudogTrottier 是的,这是完美的,非常感谢你,现在我明白你是否想回答,所以我给出正确的答案没关系 【参考方案1】:

$row 成为对象$returnApp 的属性作为关联数组。我认为你尝试只传递 suser_sids 所以它应该是这样的

$returnApp=array( 
    'LOGIN' => 'Log_In_Success', 
    'susers_sids' => $row['susers_sids']
); 

所以它会返回:

 
    LOGIN: "Log_In_Success" , 
    susers_sids: "3"

或者,您可以使用array_merge_recursive 将行包含在我们的对象中(作为一个关联数组),但除非确实必要,否则我不会存储/传递用户密码。

编辑: 您可以/应该这样做的另一种方法是创建一个实际对象而不是使用关联数组。像这样的东西会创建一个匿名对象,您可以像现在一样将其传递给 json_encode(欢迎使用 OOP):

$returnAPP->LOGIN="Log_In_Success";
$returnAPP->susers_sids=$row['susers_sids'];
echo json_encode($returnApp);

你甚至可以定义这样的类,但 PHP 就是这样,它会为你创建 stdObject ;)

【讨论】:

以上是关于如何在 JsonObject 中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从其路径中获取 JSONObject 中的嵌套值?

在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值

jsonobject怎么获取json中某个值

如何从 NodeJS 中的 JSONObject 获取值?

如何在 jsonobject 中设置数组值

JSONObject遍历获取键值方法合并两个JSONObject