如何在 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' => 'Log_In_Success', 'susers_sids' => $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 中获取值的主要内容,如果未能解决你的问题,请参考以下文章