2017-07-09 97 views
1

我掙扎着一個錯誤,告訴我它不能將字符串值轉換爲JSONObject。我試圖將CSRFToken作爲參數傳遞給我的JSONObjectRequest。我不知道這是否是正確的解決方法。類型字符串的值不能轉換爲JSONObject

我收到錯誤消息:org.json.JSONException: Value inz9J9w0N5qASdJO8soWFBZ4UrEpdnjnpmxvFbJ2 of type java.lang.String cannot be converted to JSONObject

相關代碼如下。

HashMap<String, String> params = new HashMap<>(); 
params.put("_token", ((TestApplication) getApplication()).getCSRFToken()); 

JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(params), new Response.Listener<JSONObject>() { 
    @Override 
    public void onResponse(JSONObject response) { 
     AlertDialog alertDialog = new AlertDialog.Builder(RegisterActivity.this).create(); 
     alertDialog.setTitle("Alert"); 
     Log.i("response", response.toString()); 
     alertDialog.setMessage(response.toString()); 
     alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
     alertDialog.show(); 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     AlertDialog alertDialog = new AlertDialog.Builder(RegisterActivity.this).create(); 
     alertDialog.setTitle("Alert"); 
     alertDialog.setMessage(error.getMessage()); 
     alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
     alertDialog.show(); 
    } 
}); 

queue.add(stringRequest); 

有誰知道我可能做錯了什麼,以及如何糾正這個問題?

+0

不.getCSRFToken()返回正是 「inz9J9w0N5qASdJO8soWFBZ4UrEpdnjnpmxvFbJ2」 還是有額外的字符,如引號或大括號? – phatfingers

回答

0

以下內容應該是有效的。

{ 
    "_token": "inz9J9w0N5qASdJO8soWFBZ4UrEpdnjnpmxvFbJ2" 
} 

你可以嘗試

String tokenString = (String) ((TestApplication) getApplication()).getCSRFToken(); 
JSONObject params = new JSONObject(); 
params.put("_token", tokenString); 

JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, params, new Response.Listener<JSONObject>() { 
// ... 
} 
+0

我也試過這種方法,而不是使用HashMap。我一直在玩它幾個小時,這沒有任何意義。有沒有辦法找到更多關於錯誤的信息? VolleyError必須有一些東西。 – user3439733

+0

我發現(無論出於何種原因)我的服務器正在返回令牌,錯誤發生在'parseNetworkResponse'中。 – user3439733

+0

所以它似乎不是JSON轉換的問題,但是當你的服務器響應。你可以檢查服務器的響應,確保它返回正確的數據格式。 – Lawliet

0

我已經想通了。 JsonObjectRequest不發送任何接受標頭。添加一個接受頭後,我能夠得到我以後的迴應。

最終代碼:

HashMap<String, String> params = new HashMap<>(); 

JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(params), new Response.Listener<JSONObject>() { 
    @Override 
    public void onResponse(JSONObject response) { 
     // ... 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     AlertDialog alertDialog = new AlertDialog.Builder(RegisterActivity.this).create(); 
     alertDialog.setTitle("Alert"); 
     //alertDialog.setMessage(error.toString()); 
     alertDialog.setMessage(new String(error.networkResponse.data)); 
     alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
     alertDialog.show(); 
    } 
}) { 
    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> params = new HashMap<>(); 
     params.put("X-CSRF-TOKEN", ((TestApplication) getApplication()).getCSRFToken()); 
     params.put("Accept", "application/json"); 
     return params; 
    } 
}; 

queue.add(stringRequest); 
相關問題