错误:org.json.JSONEXception:类型java.lang.String的值Access无法转换为JSONObject

时间:2013-04-02 17:45:44

标签: java android json

我正在尝试创建一个Android登录应用程序,正如您所看到的,您可以使用登录按钮登录。它将向服务器发送POST请求,服务器将返回JSON数据。我的应用程序接收数据但无法解析它。在此之后它没有做任何事情,但我首先想让这个工作。这是我的代码:

MainActivity.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 android.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 个答案:

答案 0 :(得分: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";
}