2016-05-17 52 views
2

我已经使用凌云实现了一个自定义请求,以便登录到网络服务器。Android凌空自定义请求

这是使用功能的IM:

private void volleyTest2(String username, String password, String deviceid) { 

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

    params.put("username", username); 
    params.put("password", password); 
    //params.put("device_id", deviceid); 
    params.put("device_id", "H767A76S7D6D"); 

    Volley.newRequestQueue(MainActivity.this).add(
     new CustomJsonRequest(Request.Method.POST, URL, params, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        String output=""; 
        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          output+=obj.getString("name") + " "+ obj.getString("surname"); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 
        Toast.makeText(getApplicationContext(), "Benvenuto, " + output, Toast.LENGTH_LONG).show(); 
        showProgress(false); 
       } 
      }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("Error: " + error.getMessage()); 
         Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         showProgress(false); 
        } 
       } 

     ) 

     { 
      @Override 
      protected Response parseNetworkResponse(NetworkResponse response) { 
       try { 

        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
        return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 

       } catch (UnsupportedEncodingException e) { 
        return Response.error(new ParseError(e)); 
       } catch (JSONException je) { 
        return Response.error(new ParseError(je)); 
       } 
      } 

     } 

    ); 

} 

这是我CustomJsonRequest:

public class CustomJsonRequest extends Request { 

Map<String, String> params; 
private Response.Listener listener; 

public CustomJsonRequest(int requestMethod, String url, Map<String, String> params, Response.Listener responseListener, Response.ErrorListener errorListener) { 
    super(requestMethod, url, errorListener); 
    this.params = params; 
    this.listener = responseListener; 
} 

@Override 
protected void deliverResponse(Object response) { 
    listener.onResponse(response); 
} 

@Override 
public Map<String, String> getParams() throws AuthFailureError { 
    return params; 
} 

@Override 
protected Response parseNetworkResponse(NetworkResponse response) { 
    try { 
     String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
     return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JSONException je) { 
     return Response.error(new ParseError(je)); 
    } 
} 

}

因为我不能编辑PHP端是这样的情景: - 如果登录是正确的,我收到一个JSONArray - 如果登录不正确,我收到一个像这样的JSONObject: 我唯一的问题是,如果登录不正确,我收到此错误: Error: org.json.JSONException: Value {"error":"Username\/password non trovati"} of type org.json.JSONObject cannot be converted to JSONArray

那么,如何处理不正确的登录,如果我得到一个JSONObject而不是JSONArray的? 我想只显示对象里面的内容,所以:"Username\/password non trovati"

UPDATE1:

private void volleyTest2(String username, String password, String deviceid) { 

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

    params.put("username", username); 
    params.put("password", password); 
    //params.put("device_id", deviceid); 
    params.put("device_id", "H767A76S7D6D"); 

    Volley.newRequestQueue(MainActivity.this).add(
     new CustomJsonRequest(Request.Method.POST, URL, params, 
      new Response.Listener<JsonElement>() { 
       @Override 
       public void onResponse(JsonElement element) { 
        String output=""; 
        // Parsing json 

        if(element.isJsonArray()){ 
         JsonArray array=element.getAsJsonArray(); 
         //read response here 
         Log.d(TAG,"array.toString(): " + array.toString()); 

        }else if(element.isJsonObject()){ 
         JsonObject object=element.getAsJsonObject(); 
         //read response here 
         Log.d(TAG,"object.toString(): " + object.toString()); 

        } 


        Toast.makeText(getApplicationContext(), "Benvenuto, " + output, Toast.LENGTH_LONG).show(); 
        showProgress(false); 
       } 
      }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("Error: " + error.getMessage()); 
         Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         showProgress(false); 
        } 
       } 

     ) 

     { 
      @Override 
      protected Response parseNetworkResponse(NetworkResponse response) { 
       try { 

        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
        return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 

       } catch (UnsupportedEncodingException e) { 
        return Response.error(new ParseError(e)); 
       } catch (JSONException je) { 
        return Response.error(new ParseError(je)); 
       } 
      } 

     } 

    ); 

} 

回答

0

Possiblities
申请数据的返回类型为com.google.gson.JsonElement.class和检查这样

 @Override 
     public void onResponse(JsonElement element) { 
      if(element.isJsonArray()){ 
       JsonArray array=element.getAsJsonArray(); 
       //read response here 
      }else if(element.isJsonObject()){ 
       JsonObject object=element.getAsJsonObject(); 
       //read response here 
      } 
     } 

2.使字符串请求尝试转换它JSONArrayJSONObject。转换时捕获这些异常如果发生(JSONException:JSONObject不能转换为JSONArray)

。让StringRequest并解析响应JsonElement,检查其是否JsonObjectJsonArray

 @Override 
     public void onResponse(String s) { 
      JsonParser parser = new JsonParser(); 
      JsonElement element = parser.parse(s); 

      if (element.isJsonArray()) { 
       JsonArray array = element.getAsJsonArray(); 
       //read response here 
      } else if (element.isJsonObject()) { 
       JsonObject object = element.getAsJsonObject(); 
       //read response here 
      } 

     } 

4.最好的办法:修改服务器代码:)

happyCoding;

+0

Dem,仍然一样。 它是正确的,它有效,otherwyse,无论如何返回这个字符串: 错误:org.json.JSONException:值{“错误”:“用户名\ /密码非trovati”}类型org.json.JSONObject无法转换为JSONArray – Vesco

+0

你试过了哪一个? – Bharatesh

+0

其工作与否... **:)** – Bharatesh