android - 使用 volley Json 获取空数组 [] 响应

标签 android arrays json android-volley http-get

我通过 Web 服务器调用从 API 获取一些数据。如果我使用基本的网络调用(使用 HttpGet),我就能够获取我期望的数据。但是通过使用 Volley Json 我得到一个空数组 [] 作为响应。

我收到以下 jsonarray 响应。

[
  {
  "nickname":"panikos",
  "username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e393828d8a888c90a3848e828a8fcd808c8e" rel="noreferrer noopener nofollow">[email protected]</a>",
  "user_type":"LEADER",
  "latest_steps":"2"
  },
{
  "nickname":"nikki",
  "username":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="452b2c2e2e2c052228242c296b262a28" rel="noreferrer noopener nofollow">[email protected]</a>",
  "user_type":"MASTER",
  "latest_steps":"3"
  },
...........
...........
...........
...........
]

这是我使用 volley 从服务器获取数据的代码

JsonArrayRequest arrReq = new JsonArrayRequest(lUrl, new 
        Response.Listener<JSONArray>() 
        {
    public void onResponse(JSONArray arg0)
    {
        Log.d("debug","json Array"+arg0.toString());

        mListener.notifyResponse(arg0.toString());
    };
        }, new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError arg0) {

                Log.d("debug", "Error Response"+arg0.toString()); 

                if (arg0.networkResponse == null) {
                    if (arg0.getClass().equals(TimeoutError.class)) {
                        // Show timeout error message   
                        mListener.notifyConnection("Oops.Timeout! Please check your connection.");
                    }
                }else{
                    mListener.notifyError(arg0);    

                }
            }

        })
{
    public Map<String, String> getHeaders() throws AuthFailureError {

        HashMap<String, String> params = new HashMap<String, String>();
        String creds = String.format("%s:%s",XippXX,XXcvXX);
        String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
        params.put("Authorization", auth);
        return params;
    }
};

AppController.getInstance().adToRequestQure(arrReq);

每次我在 volley Json 响应中得到一个空数组 [] 时,都使用此代码。但我尝试了与基本 Http 调用相同的操作(通过使用 Asynctask),它给出了我所期望的正确数据。

这是我使用普通 Web 请求调用获取数据的基本代码::

@Override
protected Void doInBackground(String... params) {

    try {

        HttpGet request=new HttpGet(params[0]);
        DefaultHttpClient httpClient=new DefaultHttpClient();

        String creds = String.format("%s:%s","XippXX","XXcvXX");
        String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);

        request.setHeader("Authorization", auth);
        HttpResponse response=httpClient.execute(request);  
        HttpEntity Entity=response.getEntity();
        String jsondata = EntityUtils.toString(Entity);

        Log.d("debug", "Json Data in Asynctask:: "+jsondata);

        JSONArray lJsonArray=new JSONArray(jsondata);

        Log.d("debug", "Json Array Data:: "+lJsonArray.toString());


    }       
    catch (Exception e) {

        e.printStackTrace();            
    }

    return null;
}  

这段代码工作完美..但我很高兴知道我在 Volley Json 中哪里犯了错误?我尝试了太多场景(我无法在此处显示),例如 StringRequest,以及其他一些场景,例如 Base64.DEFAULT,但没有运气。

抱歉英语不好而且问题很长。任何人都可以指出我..谢谢!!!

最佳答案

我遇到了类似的问题,问题的根源是您尝试使用参数执行 GET,它与 POST 不同,因此您需要修改您的请求。

这是一个可能对您有帮助的通用模板,尝试这样的请求(对参数进行修改..):

编辑:

       Map<String, Object> params = new HashMap<>() ;
       String creds = String.format("%s:%s",XippXX,XXcvXX);
       String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP);
       params.put("Authorization", auth);
       String urlWithParams = createGetWithParams(originalUrl, params);

        DecodedStringRequest request = new DecodedStringRequest(Request.Method.GET, urlWithParams, 
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Log.d(TAG + ": ", "Volley Response: " + response.toString());

                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        if (null != error.networkResponse)
                        {
                            Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode);
                        }
                    }
                });

        requestQueue.add(request);

并在此处检查您的回复:

public class DecodedStringRequest extends StringRequest
{
    private static final String TAG = "DecodedStringRequest";
    private final Response.Listener<String> mListener;

    public DecodedStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener)
    {
        super(method,url, listener, errorListener);
        mListener = listener;
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response)
    {
        try
        {
            //add some more of your magic here if needed... maybe print the data to see
            String responseBody = new String(response.data, "utf-8");
            return (Response.success(responseBody, getCacheEntry()));
        }
        catch (UnsupportedEncodingException e)
        {
            VolleyLog.e("UnsupportedEncodingException");
            Log.d(TAG +" NetworkResponse Exception", e.getMessage() );
            return (Response.success("Uploaded, problem with url return", getCacheEntry()));
        }
    }

    @Override
    protected void deliverResponse(String response)
    {
        mListener.onResponse(response);
    }
}

哦还有:

private String createGetWithParams(String url, Map<String, Object> params)
{
    StringBuilder builder = new StringBuilder();
    for (String key : params.keySet())
    {
        Object value = params.get(key);
        if (value != null)
        {
            try
            {
                value = URLEncoder.encode(String.valueOf(value), HTTP.UTF_8);
                if (builder.length() > 0)
                    builder.append("&");
                builder.append(key).append("=").append(value);
            }
            catch (UnsupportedEncodingException e)
            {
                Log.d(TAG + " createGetWithParams: ", e.getMessage());
            }
        }
    }
    return (url + "?" + builder.toString());
}

希望这有帮助!

关于android - 使用 volley Json 获取空数组 [] 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30637147/

相关文章:

javascript - 如何在 JavaScript 中解析不寻常的 JSON 文件?

Android 菜单,在运行 onPrepareOptionsMenu 时抛出 IndexOutOfBoundsException

android - QUICKBLOX 尝试在空对象引用上调用虚拟方法 sendMessage

java - 如何在设备 sleep 时保持 ChromeCast session 处于 Activity 状态?

arrays - Racket:宏输出一些奇怪的东西而不是数组

javascript - 使用没有 sort() 方法的数字对数组进行排序

c - 从堆栈和堆中获取二维数组的函数

Android:AppCompat 21,如何将返回图标和溢出图标更改为自定义图标?

javascript - PHP、JSON 在删除时无法正确显示

javascript - 如何有效地将 json 转换为缩进文本树?