org.json.JSONException:java.lang.String 类型的值连接无法转换为 JSONArray
Posted
技术标签:
【中文标题】org.json.JSONException:java.lang.String 类型的值连接无法转换为 JSONArray【英文标题】:org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 【发布时间】:2020-03-26 17:33:39 【问题描述】:我正在尝试登录,它给了我JSONExceptionError
。下面是我的登录代码。如果我将localhost
放在我的 php 代码中,它可以工作,但是对于这个 IP 地址它不起作用。
public class MainActivity extends AppCompatActivity
TextView textView;
Button login_button;
EditText Username,Password;
String username,password;
String login_url = "http://192.168.0.21/maps/login.php";
AlertDialog.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.reg_txt);
textView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent(MainActivity.this,Register.class);
startActivity(intent);
);
builder = new AlertDialog.Builder(MainActivity.this);
login_button = (Button)findViewById(R.id.bn_login);
Username = (EditText)findViewById(R.id.login_name);
Password = (EditText)findViewById(R.id.login_password);
login_button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
username = Username.getText().toString();
password = Password.getText().toString();
if(username.equals("")||password.equals(""))
builder.setTitle("Something went wrong");
displayAlert("Enter a valid username and password");
else
StringRequest stringRequest = new StringRequest(Request.Method.POST, login_url, new Response.Listener<String>()
@Override
public void onResponse(String response)
try
JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = jsonArray.getJSONObject(0);
String code = jsonObject.getString("code");
if(code.equals("login_failed"))
builder.setTitle("Error in login");
displayAlert(jsonObject.getString("message"));
else
startActivity(new Intent(MainActivity.this,MapsActivity.class));
catch (JSONException e)
e.printStackTrace();
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
)
@Override
protected Map<String,String> getParams() throws AuthFailureError
Map<String,String> params = new HashMap<>();
params.put("user_name",username);
params.put("password",password);
return params;
;
MySingeleton.getInstance(MainActivity.this).addToRequestque(stringRequest);
);
public void displayAlert(String message)
builder.setMessage(message);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
Username.setText("");
Password.setText("");
);
AlertDialog alertDialog = builder.create();
alertDialog.show();
下面是我的php连接代码。在浏览器中运行后,它给出了输出,但数据没有插入到数据库中。
<?php
header('Content-Type: application/json');
$host = "";
$user_name = "android";
$user_password = "^AndroidReg2019";
$db_name = "mapdb";
$conn = mysqli_connect($host,$user_name,$user_password,$db_name);
if($conn)
echo "Connection success..";
else
echo "Connection failed...";
?>
以下是我的登录 php 代码。
<?php
require "init.php";
$user_name = $_POST["user_name"];
$password = $_POST["password"];
$sql = "select user_name from user_info where user_name = '$user_name' and password = '$password';";
$result = mysqli_query($conn,$sql);
$response = array();
if(mysqli_num_rows($result)>0)
$row = mysqli_fetch_row($result);
$name = $row[0];
$code = "login_success";
array_push($response,array("code"=>$code,"user_name"=>$user_name));
echo json_encode($response);
else
$code = "login_failed";
$message = "Please verify credentials and try login again.";
array_push($response,array("code"=>$code,"message"=>$message));
echo json_encode($response);
mysqli_close($conn);
?>
【问题讨论】:
链接 192.168.0.21/maps/login.php 是否在 POSTMAN/任何其他 REST 服务工具中工作? 是的。它的工作。 你能把你发送到链接的Json发给我吗? 不,我的意思是您通过邮件发送的值 name=a&email=a&user_name=a&password=a 【参考方案1】:问题出在这行
JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = jsonArray.getJSONObject(0)
您的数据已经是一个 JSONObject。无需将响应转换为数组并获取对象。
这样做很简单:
JSONObject jsonObject = new JSONObject(response);
【讨论】:
你的回答很到位,但她面临的问题是与她的 SQL 的连接,一些 PHP 与 MYSQL 的连接问题【参考方案2】:以下是我的一些观察结果
您正在解析代码中提到的参数中的名称 你只是在解析还可以尝试修剪您的用户名和密码,以确保您没有解析不必要的空格 最后一个选项尝试将 localhost 放入 $host = "";表示 $host = "localhost"params.put("用户名",用户名); params.put("密码",密码);
【讨论】:
以上是关于org.json.JSONException:java.lang.String 类型的值连接无法转换为 JSONArray的主要内容,如果未能解决你的问题,请参考以下文章
org.json.JSONException:电子邮件没有值
org.json.JSONException:overview_polyLine 没有值
类型 org.json.JSONException 被定义多次
java.lang.classnotfoundexception org.json.jsonexception
在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值