类型 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);