我在我的項目中使用Volley
來處理網絡請求。下面是一個示例JSON
我的服務器返回利用Volley處理響應
JSON對象響應
{"code":"success", "data":{"some data"}}
JSON陣列響應
{"code":"success", "data":["some data"]}
當某些驗證錯誤或任何其他誤差時,服務器返回以下響應:
{"code":"failed", "error":"Access denied"}
問題在於解析數據。當請求成功時,在ResponseListener
的onResponse
中,我簡單地得到data
密鑰的內容。在那裏,我期待的結果與我在上面發佈的結果相同。我不明白爲什麼Volley
只返回data
的內容而不完成JSON
。我以前也用過Volley
。但從未遇到過這樣的問題。
解析代碼:成功
private void getOnboardingCategories() {
Response.Listener<JSONArray> responseListener = new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(LOG_TAG, "CATEGORY RESPONSE: " + response.toString());
if (response != null) {
int dataLength = response.length();
for (int i = 0; i < dataLength; i++) {
JSONObject jObject = response.optJSONObject(i);
if (jObject != null) {
CategoryType2 categoryType2 = new CategoryType2();
categoryType2.set_id(jObject.optString("_id"));
categoryType2.setName(jObject.optString("name"));
categoryType2.setApp_icon_data(jObject.optString("thumbnail_data"));
categories.add(categoryType2);
}
}
}
if (isVisible())
sellAdapter.notifyDataSetChanged();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
Util.errorHandler(error, ctx);
}
};
JsonArrayRequest jsonObjectRequest = new JsonArrayRequest(Method.GET, url,
null, responseListener, errorListener);
MyApplication.getInstance().addToRequestQueue(jsonObjectRequest, "onboarding");
}
響應:
{
code: "success",
data: [
{
_id: "55c06b05a3e0041a73cea744",
name: "Test Category 1",
thumbnail_data: "",
},
{
_id: "55c06b16a3e0046108cea744",
name: "Test Category 2",
thumbnail_data: "",
}
]
}
在ResponseListener
onResponse
,我得到這樣的數據:
[
{
_id: "55c06b05a3e0041a73cea744",
name: "Test Category 1",
thumbnail_data: "",
},
{
_id: "55c06b16a3e0046108cea744",
name: "Test Category 2",
thumbnail_data: "",
}
]
當錯誤發生時,服務器返回此響應:
{"code":"failed", "error":"error_msg"}
由此,Volley
拋出ParseException
因爲它期望JSONArray
。我需要向用戶顯示錯誤信息。早些時候,我使用AsyncTask
,我在那裏處理錯誤。但是,Volley
我面臨困難。我看着VolleyError
,但沒有得到任何線索。
更新1
private void getOnboardingCategories() {
showSpinnerDialog(true);
Response.Listener<JSONObject> responseListener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(LOG_TAG, "CATEGORY RESPONSE: " + response.toString());
hideSpinnerDialog();
String code = response.optString("code");
if (code.equals("success")) {
if (response != null) {
JSONArray dataArray = response.optJSONArray("data");
int dataLength = dataArray.length();
for (int i = 0; i < dataLength; i++) {
JSONObject jObject = dataArray.optJSONObject(i);
if (jObject != null) {
CategoryType2 categoryType2 = new CategoryType2();
categoryType2.set_id(jObject.optString("_id"));
categoryType2.setName(jObject.optString("name"));
categoryType2.setApp_icon_data(jObject.optString("app_icon_data"));
categories.add(categoryType2);
}
}
}
}
if (isVisible())
sellAdapter.notifyDataSetChanged();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
Util.errorHandler(error, ctx);
}
};
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.GET, url,
null, responseListener, errorListener);
MyApplication.getInstance().addToRequestQueue(jsonObjectRequest, "onboarding");
}
更新 這個問題是不是Volley
。服務器端有wrt gzip壓縮問題。我將爲投票結束這個問題。
解析代碼添加 – Nitish
你得到整個響應? 'update1'後仍然有問題嗎? – Blackbelt
嗨..你的update1是什麼? –