类型 org.json.JSONObject 无法转换为 JSONArray Android
type org.json.JSONObject cannot be converted to JSONArray Android
我正在尝试在表单验证过程中使用从我的 php 代码返回的 json 数据,但收到此类型 org.json.JSONObject cannot be converted to JSONArray 错误。我现在好像不知道是什么问题,下面的错误指向第80行
Json数据看起来是这样
{
"code": "VAL500",
"valError": {
"username": "The Username field must be at least 5 characters in length.",
"password": "The Password field must be at least 5 characters in length.",
"submit": ""
}
}
和LoginActivity
package com.example.drawerlayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LoginActivity";
private EditText username, password;
private static String URL_REGIST = "http://192.168.43.54/airtimeflip/login/android_login_validate";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
Window window = getWindow();
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// finally change the color
window.setStatusBarColor(ContextCompat.getColor(LoginActivity.this,R.color.white));
}
public void loginValidate(View v) {
final String uname = username.getText().toString();
final String pass = password.getText().toString();
// Toast.makeText(getBaseContext(), "USERNAME: " + uname + " PASSWORD: "+ pass, Toast.LENGTH_SHORT).show();
// check if the username and password matches
if (uname.equals("")) {
username.setError("Please Enter a Username");
}
else if(pass.equals("")) {
password.setError("Please Enter your Password");
}else{
login(uname, pass);
}
}
private void login(final String uname, final String pass){
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGIST,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
String code = jsonObject.getString("code");
// form validation Error
if (code.equals("VAL500")){
JSONArray jsonArray = jsonObject.getJSONArray("valError");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject error = jsonArray.getJSONObject(i);
username.setError(error.getString("username").trim());
password.setError(error.getString("password").trim());
}
}
// invalid user information provided
if (code.equals("UEX400")){
String errMsg = jsonObject.getString("userDataError");
Toast.makeText(LoginActivity.this, errMsg, Toast.LENGTH_SHORT).show();
}
// valid user infroomation provided
if (code.equals("UEX200")){
JSONArray jsonArray = jsonObject.getJSONArray("details");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject details = jsonArray.getJSONObject(i);
String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
String manager = details.getString("account_manager").trim();
String status = details.getString("status").trim();
Intent dashboard = new Intent(LoginActivity.this,MainActivity.class);
dashboard.putExtra("username", name);
dashboard.putExtra("email", email);
dashboard.putExtra("type", type);
dashboard.putExtra("manager", manager);
dashboard.putExtra("status", status);
startActivity(dashboard);
}
}
} catch (JSONException e) {
e.printStackTrace();
Log.d(TAG, "onResponse: Clicked." + e.toString());
// Toast.makeText(LoginActivity.this, "Login Error! "+ e.toString(), Toast.LENGTH_SHORT).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(LoginActivity.this, "Login Error! "+ error.toString(), Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("username", uname);
params.put("password", pass);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
并显示错误
09-17 22:28:06.100 3994-3994/com.example.drawerlayout W/System.err: org.json.JSONException: Value {"username":"","password":"The Password field must be at least 5 characters in length."} at valError of type org.json.JSONObject cannot be converted to JSONArray
09-17 22:28:06.100 3994-3994/com.example.drawerlayout W/System.err: at org.json.JSON.typeMismatch(JSON.java:100)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at org.json.JSONObject.getJSONArray(JSONObject.java:588)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.example.drawerlayout.LoginActivity.onResponse(LoginActivity.java:80)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.example.drawerlayout.LoginActivity.onResponse(LoginActivity.java:72)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Looper.loop(Looper.java:135)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5293)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at java.lang.reflect.Method.invoke(Native Method)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout D/LoginActivity: onResponse: Clicked.org.json.JSONException: Value {"username":"","password":"The Password field must be at least 5 characters in length."} at valError of type org.json.JSONObject cannot be converted to JSONArray
valError
不是数组。它是一个对象。你应该得到它
JsonObject jsonValError = jsonObject.getAsJsonObject("valError")
为此,您可以获得字段 username
,例如
String username = jsonValError.getString("username")
你的代码是正确的
您的 Json 格式不正确,您的数组
中缺少 []
试试这个:
{
"code": "VAL500",
"valError": [{
"username": "The Username field must be at least 5 characters in length.",
"password": "The Password field must be at least 5 characters in length.",
"submit": ""
}]
}
EDIT :
在 php 中使用正确的 json 格式:
echo json_encode($response);
我正在尝试在表单验证过程中使用从我的 php 代码返回的 json 数据,但收到此类型 org.json.JSONObject cannot be converted to JSONArray 错误。我现在好像不知道是什么问题,下面的错误指向第80行
Json数据看起来是这样
{
"code": "VAL500",
"valError": {
"username": "The Username field must be at least 5 characters in length.",
"password": "The Password field must be at least 5 characters in length.",
"submit": ""
}
}
和LoginActivity
package com.example.drawerlayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LoginActivity";
private EditText username, password;
private static String URL_REGIST = "http://192.168.43.54/airtimeflip/login/android_login_validate";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
Window window = getWindow();
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// finally change the color
window.setStatusBarColor(ContextCompat.getColor(LoginActivity.this,R.color.white));
}
public void loginValidate(View v) {
final String uname = username.getText().toString();
final String pass = password.getText().toString();
// Toast.makeText(getBaseContext(), "USERNAME: " + uname + " PASSWORD: "+ pass, Toast.LENGTH_SHORT).show();
// check if the username and password matches
if (uname.equals("")) {
username.setError("Please Enter a Username");
}
else if(pass.equals("")) {
password.setError("Please Enter your Password");
}else{
login(uname, pass);
}
}
private void login(final String uname, final String pass){
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGIST,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
String code = jsonObject.getString("code");
// form validation Error
if (code.equals("VAL500")){
JSONArray jsonArray = jsonObject.getJSONArray("valError");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject error = jsonArray.getJSONObject(i);
username.setError(error.getString("username").trim());
password.setError(error.getString("password").trim());
}
}
// invalid user information provided
if (code.equals("UEX400")){
String errMsg = jsonObject.getString("userDataError");
Toast.makeText(LoginActivity.this, errMsg, Toast.LENGTH_SHORT).show();
}
// valid user infroomation provided
if (code.equals("UEX200")){
JSONArray jsonArray = jsonObject.getJSONArray("details");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject details = jsonArray.getJSONObject(i);
String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
String manager = details.getString("account_manager").trim();
String status = details.getString("status").trim();
Intent dashboard = new Intent(LoginActivity.this,MainActivity.class);
dashboard.putExtra("username", name);
dashboard.putExtra("email", email);
dashboard.putExtra("type", type);
dashboard.putExtra("manager", manager);
dashboard.putExtra("status", status);
startActivity(dashboard);
}
}
} catch (JSONException e) {
e.printStackTrace();
Log.d(TAG, "onResponse: Clicked." + e.toString());
// Toast.makeText(LoginActivity.this, "Login Error! "+ e.toString(), Toast.LENGTH_SHORT).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(LoginActivity.this, "Login Error! "+ error.toString(), Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("username", uname);
params.put("password", pass);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
并显示错误
09-17 22:28:06.100 3994-3994/com.example.drawerlayout W/System.err: org.json.JSONException: Value {"username":"","password":"The Password field must be at least 5 characters in length."} at valError of type org.json.JSONObject cannot be converted to JSONArray
09-17 22:28:06.100 3994-3994/com.example.drawerlayout W/System.err: at org.json.JSON.typeMismatch(JSON.java:100)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at org.json.JSONObject.getJSONArray(JSONObject.java:588)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.example.drawerlayout.LoginActivity.onResponse(LoginActivity.java:80)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.example.drawerlayout.LoginActivity.onResponse(LoginActivity.java:72)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err: at android.os.Looper.loop(Looper.java:135)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5293)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at java.lang.reflect.Method.invoke(Native Method)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-17 22:28:06.103 3994-3994/com.example.drawerlayout D/LoginActivity: onResponse: Clicked.org.json.JSONException: Value {"username":"","password":"The Password field must be at least 5 characters in length."} at valError of type org.json.JSONObject cannot be converted to JSONArray
valError
不是数组。它是一个对象。你应该得到它
JsonObject jsonValError = jsonObject.getAsJsonObject("valError")
为此,您可以获得字段 username
,例如
String username = jsonValError.getString("username")
你的代码是正确的
您的 Json 格式不正确,您的数组
中缺少 []试试这个:
{
"code": "VAL500",
"valError": [{
"username": "The Username field must be at least 5 characters in length.",
"password": "The Password field must be at least 5 characters in length.",
"submit": ""
}]
}
EDIT :
在 php 中使用正确的 json 格式:
echo json_encode($response);