【问题标题】:Getting empty array [] response with volley Json使用凌空 Json 获取空数组 [] 响应
【发布时间】:2015-06-04 07:04:06
【问题描述】:

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

我得到以下 jsonarray 响应。

[
  {
  "nickname":"panikos",
  "username":"panikos@gmail.com",
  "user_type":"LEADER",
  "latest_steps":"2"
  },
{
  "nickname":"nikki",
  "username":"nikki@gmail.com",
  "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);

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

这是我通过普通网络请求调用获取数据的基本代码::

@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,但没有运气。

抱歉,英语很差,问题很长。任何人都可以指出我..谢谢!!!

【问题讨论】:

    标签: android arrays json android-volley http-get


    【解决方案1】:

    我遇到了类似的问题,问题的根源是您尝试使用参数执行 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());
    }
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢@TommySM.. 我会检查这个,让你!
    • 嗨,Tommy,我试过了,我得到错误响应代码:401 06-04 14:18:02.912: E/Volley(6732): [487] BasicNetwork.performRequest: Unexpected response code 401为您的网址
    • ummm afaik 这意味着身份验证问题,您是否添加了身份验证参数?
    • 是的,我正在添加.. 就像下面的 HashMap params = new HashMap(); String creds = String.format("%s:%s",XXppXX,XXooXX); String auth = "基本" + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); params.put("授权", auth); String urlWithParams = createGetWithParams(lUrl, params);
    • @Moudiz 我去看看
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 2016-07-25
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多