【问题标题】:Android Model for JSON parsing shows ClassCastException: com.google.gson.JsonObject can not be casted to com.google.gson.JsonArray用于 JSON 解析的 Android 模型显示 ClassCastException:com.google.gson.JsonObject 无法转换为 com.google.gson.JsonArray
【发布时间】:2016-05-06 06:36:11
【问题描述】:

我对 Android 开发相当陌生,我正在创建一个需要使用 Zomato Rest API 的应用程序。我正在使用 Koush ION 库 https://github.com/koush/ion 发送 http 请求并接收响应。为了使用这个库,我只需要创建一个模型 java 类,并将键作为 java 实例变量并调用这行代码。

     Ion.with(getActivity())
                    .load("https://developers.zomato.com/api/v2.1/geocode?lat=25.12819&lon=55.22724")
                    .setHeader("user-key",my-user-key)
                    .asJsonArray()
                    .setCallback(new FutureCallback<JsonArray>() {
                        @Override
                        public void onCompleted(Exception e, JsonArray result) {
                            if (e != null) {
                                Log.d("FoodFragment", "Error loading food"+e.toString());
                                Toast.makeText(getActivity(), "error loading food", Toast.LENGTH_LONG).show();
                                return;
                            }
                            else{
                                Log.d("FoodFragment", "Size= " + result.size() + "; " + result.toString());
                                sTrips = (List<RestaurantsZomato>) new Gson().fromJson(result.toString(), new TypeToken<List<RestaurantsZomato>>() {

                                }.getType());
                                adapter = new RestaurantAdapter(sTrips);
                                recyclerView.setAdapter(adapter);
                                mSwipeRefreshLayout.setRefreshing(false);
                                ((RestaurantAdapter) adapter).setOnItemClickListener(new RestaurantAdapter.MyClickListener() {
                                    @Override
                                    public void onItemClick(int position, View v) {
                                        Toast.makeText(getActivity(), "Item Clicked", Toast.LENGTH_LONG).show();
                                    }
                                });
                            }
                        }
                    });
        }

根据 Zomato API 文档,响应将如下所示 -

{"nearby_restaurants": {
"1": {
  "restaurant": {

  }
},
"2": {
  "restaurant": {
  }
},
"3": {
  "restaurant": {

  }
},
"4": {
  "restaurant": {

  }
},
"5": {
  "restaurant": {

  }
},
"6": {
  "restaurant": {

  }
},
"7": {

  }
},
"8": {
  "restaurant": {

  }
},
"9": {
  "restaurant": {

  }
}

我的 RestaurantZomato 课程看起来像这样 -

    public class RestaurantsZomato {
            public NearbyRestaurants nearby_restaurants;
            public static class NearbyRestaurants {
                   public List<RestaurantDetails> restaurant;
     }}

RestaurantDetails 类包含“restaurant”标签内的所有内容。我的问题是如何表示模型类的 JsonResponse 中存在的“1”、“2”、“3”等。

如果这个问题很愚蠢,我很抱歉。正如我所说,我是 Android 开发的新手,任何能指引我正确方向的资源都将不胜感激!

【问题讨论】:

  • 在你的项目中添加 gson 2.2.3.jar 库
  • @DaminiMehra 感谢您的评论。但是我的班级有 import com.google.gson.Gson;导入 com.google.gson.JsonArray;导入 com.google.gson.JsonObject;导入 com.google.gson.reflect.TypeToken;这不是说图书馆已经存在了吗?

标签: java android json ion-koush gson


【解决方案1】:

在Json格式中

{  
   "nearby_restaurants":{  
      "1":{  
         "restaurant":{  

         }
      },
      "2":{  
         "restaurant":{  

         }
      }
   }
}

对应于包含两个对象“1”和“2”的对象“nearby_restaurants”,这两个对象都包含具有空值的对象“restaurant”。

您正在尝试填充 java List 对象,但在您的 Json 中不存在任何列表或数组!

看看thisthis,你就会解决你的问题。 :-)

编辑

试试这个代码

JsonObject jsonObject = yourJsonElement.getAsJsonObject();
JsonObject nearby_restaurants = jsonObject.get("nearby_restaurants").getAsJsonObject();
Set<Entry<String, JsonElement>> objects =  nearby_restaurants.entrySet();

Gson gson = new Gson();

for (Entry<String, JsonElement> entry : objects) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}

【讨论】:

  • 感谢您提供这些链接!但是我仍然不确定如何在我的模型中表示键值“1”、“2”、“3”等,因为我的模型将 JSON 的键值作为其实例变量名称。例如,如果 JSON 是 {"Username":"viji"} 那么我的模型有 public String Username;
【解决方案2】:

公共列表餐厅;返回数组

公共 RestaurantDetails 餐厅;返回对象

您的 API 返回对象。不返回数组

试试这个!!

public class RestaurantsZomato {
        public NearbyRestaurants nearby_restaurants;
        public static class NearbyRestaurants {
               public RestaurantDetails restaurant;
 }}

更新

您的 Json 字符串返回 JsonObject。你必须使用 JsonObject

Ion.with(context)
.load("https://developers.zomato.com/api/v2.1/geocode?lat=25.12819&lon=55.22724")
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
    // do stuff with the result or error
}
 });

【讨论】:

  • 您好!感谢你的回复。我试过这个。但是我仍然遇到同样的错误。我认为这与 JSON 响应中的“1”、“2”、“3”有关,因为餐厅对象位于另一个 JSON 对象中。我不明白如何为此创建一个实例变量。
【解决方案3】:

问题是您在“nearby_restaurants”中接收到一个 JSON 对象并尝试将其作为 JSONArray 获取。正如您在 Zomato 响应中看到的那样,没有 [] 所以没有 json 数组只有对象。

【讨论】:

  • 感谢 JSON 对象和数组之间的简单明了的区别。但是将其更改为公共 RestaurantDetails 餐厅;没有解决我的问题。我仍然遇到同样的错误。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2020-04-02
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多