【问题标题】:Volley JsonObjectRequest Error responseVolley JsonObjectRequest 错误响应
【发布时间】:2018-03-07 10:31:04
【问题描述】:

我有一个简单的 Json 对象请求类,这是调用整个请求的方法,在 LogCat 中我只得到:

Volley: [2] 2.onErrorResponse: Error:

所以我不知道在哪里寻找修复

private void getBeerDetails() {
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (Request.Method.GET,
                    "https://api.punkapi.com/v2/beers/13",
                    null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    try {
                        beerName.setText(response.getString("name"));
                        alc.setText(response.getString("abv"));
                        ibu.setText(response.getString("ibu"));
                        firstBrewed.setText(response.getString("first_brewed"));
                        yeast.setText(response.getString("yeast"));
                        description.setText(response.getString("description"));
                        foodPairing.setText(response.getString("food_pairing"));

                        Picasso.with(getApplicationContext())
                                .load(response.getString("image_url"))
                                .into(beerImageView);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("Error:", error.getMessage());
                }
            });

    requestQueue.add(jsonObjectRequest);
}

【问题讨论】:

  • 展示你完整的日志猫。

标签: android android-volley jsonresponse


【解决方案1】:

我在这里看到您的回复是 JsonArray 格式。 所以试试下面的

private void getBeerDetails() {
    JsonArrayRequest jsonObjectRequest = new JsonArrayRequest 
            (Request.Method.GET,
                    "https://api.punkapi.com/v2/beers/13",
                    null, new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {

                       if(response.length()>0){
                           //make a loop and add item to your list
                           }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("Error:", error.getMessage());
                }
            });

    requestQueue.add(jsonObjectRequest);
}

【讨论】:

  • 是的,response 是一个数组,但这是一个单项值的数组,没有列表,它是啤酒名称、描述、图片 url 等。这是显示所有数据的单个活动
  • 好的,可以,但是必须用数组加载单个对象数据非常不直观,但感谢您的帮助
【解决方案2】:

您的错误消息不是很具有描述性。但是,我认为您需要在 GET 请求的标头中将 content-type 设置为 application/json。在创建请求时覆盖 getHeaders 函数。这是一个java示例。

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, jsonBody,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.d("TAG", response.toString());
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("TAG", error.getMessage(), error);
        }
    }){

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
        Map<String, String> params = new HashMap<String, String>();                
        params.put("Content-Type", "application/json");
        return params; 
    } 
};

更新

根据您在答案中的评论,您未能解析从 GET 请求返回的 JSON。正如我从您的响应 JSON 中看到的,您正在接收一组对象。我想建议使用 Gson 进行 JSON 解析。它简单且易于实施。您需要在响应中返回的数组中定义一个包含对象字段的类。然后只需使用 Gson 将 JSON 数组中的值转换为您创建的特定对象的数组。这是一个示例。

Gson gson = new Gson();
Data[] dataArray = gson.fromJson(jsonLine, Data[].class);

【讨论】:

  • 好的,我收到了这个代码的错误消息要求)。我认为它是对象api.punkapi.com/v2/beers/13,但是如何解析它?
  • 我明白了,我一定会深入研究那个 Gson,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多