java - 使用 String Request 和 JSONObject 解析数据时出错
问题描述
我正在开发一个需要登录系统的学校应用程序。它以前工作过,但我在我的在线数据库中添加了一些新行,我还修改了我的应用程序中的 Java 代码来存储这些数据,但是现在当我点击登录按钮时什么也没做,它不会将活动更改为我的仪表板活动,它没有显示成功登录或错误的消息,它没有做任何事情。这是我的调试控制台:
W/System.err: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
at org.json.JSON.typeMismatch(JSON.java:112)
W/System.err: at org.json.JSONObject.<init>(JSONObject.java:163)
W/System.err: at org.json.JSONObject.<init>(JSONObject.java:176)
W/System.err: at quizonwheels.quizonwheels.LoginActivity$3.onResponse(LoginActivity.java:74)
W/System.err: at quizonwheels.quizonwheels.LoginActivity$3.onResponse(LoginActivity.java:69)
W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:78)
W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
W/System.err: at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err: at android.os.Looper.loop(Looper.java:193)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我是 Java 新手,我们的老师没有向我们解释太多,我不明白为什么它不起作用。
这是我的登录功能和 SharedPrefManager 类
private void userLogin(){
final String username = UsernameEt.getText().toString().trim();
final String password = PasswordEt.getText().toString().trim();
progressDialog.show();
StringRequest stringRequest = new StringRequest(
Request.Method.POST, Constants.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject obj = new JSONObject(response);
if (!obj.getBoolean("error")){
SharedPrefManager.getInstance(getApplicationContext()).userLogin(
obj.getInt("id"),
obj.getString("username"),
obj.getString("email"),
obj.getString("firstname"),
obj.getString("lastname"),
obj.getString("country"),
obj.getString("points")
);
startActivity(new Intent(getApplicationContext(),DashboardActivity.class));
finish();
}else
{
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("username",username);
params.put("password",password);
return params;
}
};
RequestHandler.getInstance(this).addToRequestQueue(stringRequest);
和我的 SharedPrefManager 类
package quizonwheels.quizonwheels;
import android.content.Context;
import android.content.SharedPreferences;
public class SharedPrefManager {
private static SharedPrefManager mInstance;
private static Context mCtx;
private static final String SHARED_PREF_NAME ="mysharedpref12";
private static final String KEY_USERNAME="username";
private static final String KEY_USER_EMAIL="email";
private static final String KEY_USER_ID="id";
private static final String KEY_USER_FIRSTNAME="firstname";
private static final String KEY_USER_LASTNAME="lastname";
private static final String KEY_USER_COUNTRY="country";
private static final String KEY_USER_POINTS="points";
private SharedPrefManager(Context context) {
mCtx = context;
}
public static synchronized SharedPrefManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new SharedPrefManager(context);
}
return mInstance;
}
public boolean userLogin(int id, String username, String email, String firstname, String lastname, String country, String points) {
SharedPreferences sharedPreferences= mCtx.getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(KEY_USER_ID,id);
editor.putString(KEY_USER_EMAIL,email);
editor.putString(KEY_USERNAME,username);
editor.putString(KEY_USER_LASTNAME,lastname);
editor.putString(KEY_USER_FIRSTNAME,firstname);
editor.putString(KEY_USER_COUNTRY,country);
editor.putString(KEY_USER_POINTS,points);
editor.apply();
return true;
}
public boolean isLoggedIn(){
SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
if(sharedPreferences.getString(KEY_USERNAME,null)!=null){
return true;
}
return false;
}
public boolean logout(){
SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.apply();
return true;
}
}
我的PHP代码是:
<?php
require_once '../includes/DbConnect.php';
$response =array();
if($_POST['username'] && $_POST['password']){
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username=?";
$stmt = mysqli_stmt_init($con);
mysqli_stmt_bind_param($stmt,"s",$username);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if($user = mysqli_fetch_assoc($result))
{
$passwordCheck = password_verify($password,$user['password']);
if($passwordCheck == false){
$response['error'] = true;
$response['message'] = "Invalid username or password";
}
else if($passwordCheck == true) {
$response['error'] = false;
$response['id'] = $user['idUsers'];
$response['email'] = $user['email'];
$response['username'] = $user['username'];
$response['country']= $user['country'];
$response['firstname']= $user['firstname'];
$response['lastname']= $user['lastname'];
$response['points']= $user['points'];
}
}
}
echo json_encode($response);
?>
解决方案
在这一行设置断点:
JSONObject obj = new JSONObject(response);
复制response
字符串值并检查它是否是有效的 JSON 字符串。
这是一个很好的在线 JSON 验证网站。
推荐阅读
- node.js - 在 Node.js 中使用不同的方法发出多个 Https 请求
- jquery - jquery 在新创建的 mvc 项目的索引页面上不起作用
- supervisord - 当我使用 supervisorctl stop [running-program] 时会发生什么?
- cmd - 我可以在 cmd 中打开一个 pdf 名称中带有“空格”的 pdf 吗?
- json - 如何仅从 json 中获取值以输入 ng-2 图表?
- python - 具有标准 Tensorflow 的 Tensor Flow Lite 模型
- python - 如何使用 pyglet 或 pygame 接收非字母键盘输入?
- swift - 如何将从 Firestore 检索到的数据传递到 UICollectionViewCell
- ns2 - 我如何解决这个问题无定形/amorphous.cc:89:15: 错误: 'rqueue' 没有在这个范围内声明
- dialogflow-es - 如何在对话框流内联编辑器实现中使用当前位置?