Java 未转换的Json对象获取类型不匹配
当我尝试登录时,我的android logcat出现以下错误Java 未转换的Json对象获取类型不匹配,java,php,android,json,azure,Java,Php,Android,Json,Azure,当我尝试登录时,我的android logcat出现以下错误 1492-1639/net.azurewebsites.cosy W/System.err﹕ org.json.JSONException: Value The of type java.lang.String cannot be converted to JSONObject 我肯定会收到对我的服务器的请求,所以我不知道它是返回的值还是应用程序中的问题,它无法转换它 我的php如下所示: if( $conn ) { $us
1492-1639/net.azurewebsites.cosy W/System.err﹕ org.json.JSONException: Value The of type java.lang.String cannot be converted to JSONObject
我肯定会收到对我的服务器的请求,所以我不知道它是返回的值还是应用程序中的问题,它无法转换它
我的php如下所示:
if( $conn ) {
$username = $_POST["username"];
$password = $_POST["password"];
//echo($username);
// echo "Connection established.<br />";
$query = sprintf("SELECT * from Users where username = ? and password = ?");
$params1 = array( $username, $password);
$stmt = sqlsrv_query($conn, $query, $params1);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$Users = array();
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = $row['username'];
$password1= $row['password'];
}
$Users["username"] = $username1;
$Users["password"] = $password1;
echo json_encode($Users);
sqlsrv_free_stmt($stmt);
sqlsrv_close( $conn );
} else {
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
public class ServerRequests {
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 1000 * 15;
public static final String SERVER_ADDRESS = "http://cosy.azurewebsites.net/";
public ServerRequests(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing...");
progressDialog.setMessage("Please wait...");
}
public void fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
progressDialog.show();
new fetchUserDataAsyncTask(user, userCallBack).execute();
}
public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {
User user;
GetUserCallback userCallBack;
public fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
this.user = user;
this.userCallBack = userCallBack;
}
@Override
protected User doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS + "FetchUserData.php");
User returnedUser = null;
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
String result = EntityUtils.toString(entity);
JSONObject jObject = new JSONObject(result);
if (jObject.length() != 0) {
Log.v("happened", "2");
returnedUser = new User(user.username, user.password);
}
} catch (Exception e) {
e.printStackTrace();
}
return returnedUser;
}
@Override
protected void onPostExecute(User returnedUser) {
super.onPostExecute(returnedUser);
progressDialog.dismiss();
userCallBack.done(returnedUser);
}
}
}
if($conn){
$username=$_POST[“username”];
$password=$_POST[“password”];
//echo($username);
//回显“已建立连接。
”;
$query=sprintf(“从用户名=?和密码=?”的用户中选择*”;
$params1=数组($username,$password);
$stmt=sqlsrv_query($conn,$query,$params1);
如果($stmt==false){
模具(打印错误(sqlsrv_errors(),true));
}
$Users=array();
而($row=sqlsrv\u fetch\u数组($stmt,sqlsrv\u fetch\u ASSOC)){
$username1=$row['username'];
$password1=$row['password'];
}
$Users[“username”]=$username1;
$Users[“password”]=$password1;
echo json_编码($Users);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
}否则{
echo“无法建立连接。
”;
模具(打印错误(sqlsrv_errors(),true));
}
我的请求包括以下内容:
if( $conn ) {
$username = $_POST["username"];
$password = $_POST["password"];
//echo($username);
// echo "Connection established.<br />";
$query = sprintf("SELECT * from Users where username = ? and password = ?");
$params1 = array( $username, $password);
$stmt = sqlsrv_query($conn, $query, $params1);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$Users = array();
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = $row['username'];
$password1= $row['password'];
}
$Users["username"] = $username1;
$Users["password"] = $password1;
echo json_encode($Users);
sqlsrv_free_stmt($stmt);
sqlsrv_close( $conn );
} else {
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
public class ServerRequests {
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 1000 * 15;
public static final String SERVER_ADDRESS = "http://cosy.azurewebsites.net/";
public ServerRequests(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing...");
progressDialog.setMessage("Please wait...");
}
public void fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
progressDialog.show();
new fetchUserDataAsyncTask(user, userCallBack).execute();
}
public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {
User user;
GetUserCallback userCallBack;
public fetchUserDataAsyncTask(User user, GetUserCallback userCallBack) {
this.user = user;
this.userCallBack = userCallBack;
}
@Override
protected User doInBackground(Void... params) {
ArrayList<NameValuePair> dataToSend = new ArrayList<>();
dataToSend.add(new BasicNameValuePair("username", user.username));
dataToSend.add(new BasicNameValuePair("password", user.password));
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(SERVER_ADDRESS + "FetchUserData.php");
User returnedUser = null;
try {
post.setEntity(new UrlEncodedFormEntity(dataToSend));
HttpResponse httpResponse = client.execute(post);
HttpEntity entity = httpResponse.getEntity();
String result = EntityUtils.toString(entity);
JSONObject jObject = new JSONObject(result);
if (jObject.length() != 0) {
Log.v("happened", "2");
returnedUser = new User(user.username, user.password);
}
} catch (Exception e) {
e.printStackTrace();
}
return returnedUser;
}
@Override
protected void onPostExecute(User returnedUser) {
super.onPostExecute(returnedUser);
progressDialog.dismiss();
userCallBack.done(returnedUser);
}
}
}
公共类服务器请求{
进行对话进行对话;
公共静态最终int连接\u超时=1000*15;
公共静态最终字符串服务器\u地址=”http://cosy.azurewebsites.net/";
公共服务器请求(上下文){
progressDialog=新建progressDialog(上下文);
progressDialog.setCancelable(假);
progressDialog.setTitle(“处理…”);
progressDialog.setMessage(“请稍候…”);
}
public void fetchUserDataAsyncTask(用户用户,GetUserCallback userCallBack){
progressDialog.show();
新建fetchUserDataAsyncTask(用户,userCallBack).execute();
}
公共类fetchUserDataAsyncTask扩展了AsyncTask{
用户;
GetUserCallback-userCallBack;
公共fetchUserDataAsyncTask(用户用户,GetUserCallback userCallBack){
this.user=用户;
this.userCallBack=userCallBack;
}
@凌驾
受保护的用户doInBackground(无效…参数){
ArrayList dataToSend=新的ArrayList();
添加(新的BasicNameValuePair(“username”,user.username));
添加(新的BasicNameValuePair(“密码”,user.password));
HttpParams httpRequestParams=新的BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams,连接超时);
HttpConnectionParams.setSoTimeout(httpRequestParams,连接超时);
HttpClient客户端=新的默认HttpClient(httpRequestParams);
HttpPost=newhttppost(服务器地址+“FetchUserData.php”);
用户returnedUser=null;
试一试{
post.setEntity(新的UrlEncodedFormEntity(dataToSend));
HttpResponse HttpResponse=client.execute(post);
HttpEntity entity=httpResponse.getEntity();
字符串结果=EntityUtils.toString(实体);
JSONObject jObject=新JSONObject(结果);
如果(jObject.length()!=0){
日志v(“已发生”、“2”);
returnedUser=新用户(User.username、User.password);
}
}捕获(例外e){
e、 printStackTrace();
}
返回者;
}
@凌驾
PostExecute上受保护的void(用户返回用户){
super.onPostExecute(returnedUser);
progressDialog.disclose();
userCallBack.done(returnedUser);
}
}
}
我已经花了很长时间在这件事上了,我只是不知道我哪里出了问题。任何帮助都将不胜感激 PHP响应字符串似乎包含一些特殊字符或混乱的代码。因此Java中的
org.json
库无法将响应字符串转换为JSONObject
您可以尝试使用PHP中的函数urlencode
和urldecode
来处理字符串。请参阅下面的代码
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = urlencode($row['username']);
$password1= urlencode($row['password']);
}
修改下面的代码
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$username1 = urlencode($row['username']);
$password1= urlencode($row['password']);
}
及
希望能有帮助。如有任何问题,请随时通知我。您从服务器检索到的值是多少?它似乎不是有效的JSON。@Chris在提交表单时对其进行html测试时,返回以下值:{“用户名”:“joe”,“密码”:“bloggs”}从应用程序运行它时如何?在返回值后设置一个断点,看看返回的是什么。我一直认为这是可行的,因为azure在需要额外的东西时遇到了一些问题,但它似乎仍然会发出相同的错误。不知道原因,但谢谢你的建议,真的很感激@EoinÓCribín分析问题的想法是检查响应体是否包含一些Unicode字符,如
\uffef
。你可以试着下载它作为一个txt文件,并使用Hexedit逐个检查字节码,然后通过更改一些代码来调试你的代码。修复了它你是对的,最后只是我忘了添加一些东西!非常感谢你的帮助!