【问题标题】:type org.json.JSONObject cannot be converted to JSONArray Androidorg.json.JSONObject 类型无法转换为 Android 的 JSONArray
【发布时间】:2019-09-17 22:16:11
【问题描述】:

我试图在表单验证过程中使用从我的 php 代码返回的 json 数据,并得到这种类型 org.json.JSONObject 无法转换为 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$1.onResponse(LoginActivity.java:80)
09-17 22:28:06.102 3994-3994/com.example.drawerlayout W/System.err:     at com.example.drawerlayout.LoginActivity$1.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

【问题讨论】:

    标签: android json android-studio android-activity android-volley


    【解决方案1】:

    valError 不是数组。它是一个对象。你应该得到它像

    JsonObject jsonValError = jsonObject.getAsJsonObject("valError")
    

    为此,您可以获得username 字段,例如

    String username = jsonValError.getString("username")
    

    【讨论】:

      【解决方案2】:

      你的代码是正确的

      您的 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": ""
              }]
          }
      

      编辑:

      在 php 中使用正确的 json 格式:

      echo json_encode($response);
      

      【讨论】:

      • 我如何 json_ecode 这个来得到类似的东西
      • $output = array('code' => 'UEX200', 'details' => array('email' => "email", 'username' => "username", 'type' => "type", 'account_manager' => "managwe", 'status' => "active" ) );
      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 2013-08-24
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多