有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓错误:org。json。JSONEXception:java类型的值访问。无法将lang.String转换为JSONObject

我正在尝试制作一个安卓登录应用程序,你可以看到,你可以使用登录按钮登录。它将向服务器发送POST请求,服务器将返回JSON数据。我的应用程序接收到数据,但无法解析数据。在这之后它什么都不做,但我首先想让它工作起来。这是我的代码:

主要活动。java

public class MainActivity extends Activity {


private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
      sb.append((char) cp);
    }
    return sb.toString();
  }

  public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
      String jsonText = readAll(rd);
      JSONObject json = new JSONObject(jsonText);
      return json;
    } finally {
      is.close();
    }
  }

  private EditText inpUsername;
  private EditText inpPassword;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    inpUsername = (EditText) findViewById(R.id.inpUsername);
    inpPassword = (EditText) findViewById(R.id.inpPassword);

}

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void checkLogin(View v)
{
    new DoLoginAsyncTask().execute();
}   

  private class DoLoginAsyncTask extends AsyncTask<String, Void, String> {      
    private ProgressDialog LoadingDialog;
    String response = "";

    String LoadingDialogLoggingIn = getResources().getString(R.string.logging_in);



    @Override
    protected void onPreExecute() {
        LoadingDialog = new ProgressDialog(MainActivity.this);
        LoadingDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        LoadingDialog.setMessage(LoadingDialogLoggingIn);
        LoadingDialog.setCancelable(false);
        LoadingDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        String username = inpUsername.getText().toString();
        String password = inpPassword.getText().toString();

        // Creating HTTP client
        HttpClient httpClient = new DefaultHttpClient();

        // Creating HTTP Post
        HttpPost httpPost = new HttpPost("http://mysite/");

        // Building post parameters
        // key and value pair
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
        nameValuePair.add(new BasicNameValuePair("tag", "login"));
        nameValuePair.add(new BasicNameValuePair("username", username));
        nameValuePair.add(new BasicNameValuePair("password", password));

        // Url Encoding the POST parameters
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        } catch (UnsupportedEncodingException e) {
            // writing error to Log
            e.printStackTrace();
            response = response+"printStackTrace";
        }

        // Making HTTP Request
        try {
            HttpResponse response = httpClient.execute(httpPost);

            // writing response to log
            Log.d("Http Response:", response.toString());
        } catch (ClientProtocolException e) {
            // writing exception to log
            e.printStackTrace();
            response = response+"ClientProtocolException";
        } catch (IOException e) {
            // writing exception to log
            e.printStackTrace();
            response = response+"IOException";
        } 

        try{
            JSONObject json = readJsonFromUrl("http://mysite/");
            System.out.println(json.toString());
            System.out.println(json.get("id"));
        } catch(IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }



        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        LoadingDialog.dismiss();
        LoadingDialog = null;
        if(response != "") {
            Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();
        }
    }




}

}

服务器上的PHP代码:

<?php
header('Content-type: application/json; charset=utf-8');
if (isset($_REQUEST['tag']) && $_REQUEST['tag'] != '') {
$tag = $_REQUEST['tag'];
require 'config.php';
$response = array("tag" => $tag, "success" => 0, "error" => 0);
mysql_connect("$mysql_host", "$mysql_username", "$mysql_password") or die(mysql_error()); 
mysql_select_db("$mysql_db_name") or die(mysql_error());


if($tag='login') {
    if(isset($_REQUEST['username']) && $_REQUEST['username'] != '' && isset($_REQUEST['password']) && $_REQUEST['password'] != '') {
        $username = $_REQUEST['username'];
        $password = $_REQUEST['password'];
        $hash = md5($password);
        $search = mysql_query("SELECT * FROM users WHERE username='".$username."' AND password='".$hash."' AND active='1'") or die(mysql_error());
        $match  = mysql_num_rows($search);
        $result = mysql_fetch_array($search);
        if($match > 0) {
            $response['tag']="login";
            $response['success']="1";
            $response['error']="0"; 
            $response['uid']=$result['id'];
            $response['username']=$result['username'];
            $response['name']=$result['name'];
            $response['surname']=$result['surname'];
            $response['email']=$result['email'];
        } else {
            $response['tag']="login";
            $response['success']="0";
            $response['error']="10";
        }
    } else {
        //username or password not filled in
        $response['tag']="login";
        $response['success']="0";
        $response['error']="11";
    }
}



            echo json_encode($response);

} else {
echo 'Access denied';
}
?>

来自服务器的JSON响应示例:

{"tag":"login","success":"0","error":"10"}

我从LogCat得到的错误:

org.json.JSONException: Value Access of type java.lang.String cannot be converted to JSONObject
at org.json.JSON.typeMismatch(JSON.java:107)
at org.json.JSONObject.<init>(JSONObject.java:158)
at org.json.JSONObject.<init>(JSONObject.java:171)
at com.example.myapp.MainActivity.readJsonFromUrl(MainActivity.java:56)
at com.example.myapp.MainActivity$DoLoginAsyncTask.doInBackground(MainActivity.java:147)
at com.example.myapp.MainActivity$DoLoginAsyncTask.doInBackground(MainActivity.java:1)
at 安卓.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)

我希望你能帮我解决我的问题


共 (1) 个答案

  1. # 1 楼答案

    返回:Access denied意味着if语句返回false。我已经离开PHP好一阵子了,但是if($tag='login')看起来不对,你是说if($tag=='login')

    在Java上,带有=的赋值总是返回true,不确定在PHP上的行为是否不同

    PS:如果需要JSON,还应该返回一个有效的JSON错误对象,而不是Access Denied字符串。例如,让您的json响应包含"status"successfailure来简单地检查是否存在错误。这将很容易区分成功的响应和失败的响应

    PPS:我看到你用$response = array("tag" => $tag, "success" => 0, "error" => 0);试过了,所以基本上是在那里添加错误代码或类似代码,然后返回它,而不是字符串

    编辑 你在做两个请求,你知道吗

    // Making HTTP Request
    try {
        // Fist request! With your tag and username and more
        HttpResponse response = httpClient.execute(httpPost);
    
        // writing response to log
        Log.d("Http Response:", response.toString());
    } catch (ClientProtocolException e) {
        // writing exception to log
        e.printStackTrace();
        response = response+"ClientProtocolException";
    } catch (IOException e) {
        // writing exception to log
        e.printStackTrace();
        response = response+"IOException";
    } 
    
    try{
        // second request! No tag, username...
        JSONObject json = readJsonFromUrl("http://mysite/");
        System.out.println(json.toString());
        System.out.println(json.get("id"));
    } catch(IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    

    改变这一点,并尝试将其结合起来:

    try {
        // Fist request! With your tag and username and more
        HttpResponse response = httpClient.execute(httpPost);
    
        // writing response to log
        Log.d("Http Response:", response.toString());
        // try to parse it to json
        JSONObject json = new JSONObject(response.toString());
        // do what ever you like...
    } catch (ClientProtocolException e) {
        // writing exception to log
        e.printStackTrace();
        response = response+"ClientProtocolException";
    } catch (IOException e) {
        // writing exception to log
        e.printStackTrace();
        response = response+"IOException";
    }