安卓错误: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 楼答案
返回:
Access denied
意味着if语句返回false。我已经离开PHP
好一阵子了,但是if($tag='login')
看起来不对,你是说if($tag=='login')
在Java上,带有
=
的赋值总是返回true,不确定在PHP上的行为是否不同PS:如果需要JSON,还应该返回一个有效的JSON错误对象,而不是
Access Denied
字符串。例如,让您的json响应包含"status"
和success
或failure
来简单地检查是否存在错误。这将很容易区分成功的响应和失败的响应PPS:我看到你用
$response = array("tag" => $tag, "success" => 0, "error" => 0);
试过了,所以基本上是在那里添加错误代码或类似代码,然后返回它,而不是字符串编辑 你在做两个请求,你知道吗
改变这一点,并尝试将其结合起来: