Volley-Lib -> String 无法转换为具有真实 JSONObject 的 JSONObject
Volley-Lib -> String cannot be converted to JSONObject with a real JSONObject
JSONObject 是这样的:
{"tag":"login","success":1,"error":0,"name":"pb","dir":"DH","br":"LL","gr":"IW","email":"empty"}
logcat 说:
Value Access of type java.lang.String cannot be converted to JSONObject
运行 旁边有一个 AsyncTask,它可以工作。为什么 volley-code 说它是一个字符串?服务器的答案肯定是一个 JSONObject...。为什么它说它是一个字符串?
private void makeJsonObjectRequest() {
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
try {
String dir = response.getString("dir");
Log.d("dir", dir);
} catch (JSONException e) {
e.printStackTrace();
Log.d("JSONException", e.getMessage().toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("onErrorResponse", error.getMessage().toString());
}
})
{
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("name", name);
params.put("password", password);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
AppController.getInstance().addToRequestQueue(jsonObjReq);
}
我不知道为什么要附加它,但我在相同类型的请求 (HTTP POST + HEADER + PARAMS) 中遇到了同样的问题
我使用 StringRequest 修复它并手动解析它。这样试试
StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.d(TAG, "Success "+ s.toString());
try {
JSONObject data = new JSONObject(s);
String dir = data.getString("dir");
Log.d("dir", dir);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error response " + error.getMessage());
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("name", name);
params.put("password", password);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
虽然 StringRequest
的解决方法工作正常,但我发现 "real" 问题是 Volley 中非常不直观的默认实现,它导致 POST
请求变成 GET
。查看我的回答
寻求解决方案。
JSONObject 是这样的:
{"tag":"login","success":1,"error":0,"name":"pb","dir":"DH","br":"LL","gr":"IW","email":"empty"}
logcat 说:
Value Access of type java.lang.String cannot be converted to JSONObject
运行 旁边有一个 AsyncTask,它可以工作。为什么 volley-code 说它是一个字符串?服务器的答案肯定是一个 JSONObject...。为什么它说它是一个字符串?
private void makeJsonObjectRequest() {
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
try {
String dir = response.getString("dir");
Log.d("dir", dir);
} catch (JSONException e) {
e.printStackTrace();
Log.d("JSONException", e.getMessage().toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("onErrorResponse", error.getMessage().toString());
}
})
{
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("name", name);
params.put("password", password);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
AppController.getInstance().addToRequestQueue(jsonObjReq);
}
我不知道为什么要附加它,但我在相同类型的请求 (HTTP POST + HEADER + PARAMS) 中遇到了同样的问题
我使用 StringRequest 修复它并手动解析它。这样试试
StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.d(TAG, "Success "+ s.toString());
try {
JSONObject data = new JSONObject(s);
String dir = data.getString("dir");
Log.d("dir", dir);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error response " + error.getMessage());
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("name", name);
params.put("password", password);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
虽然 StringRequest
的解决方法工作正常,但我发现 "real" 问题是 Volley 中非常不直观的默认实现,它导致 POST
请求变成 GET
。查看我的回答