用于JSON解析的Android模型显示ClassCastException:com.google.gson.JsonObject无法转换为com.google.gson.JsonArray

时间:2016-05-06 06:36:11

标签: java android json ion-koush gson

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

criteria.add(Restrictions.or(Restrictions.in("crmUser.groupId", filterGroupIds)));

根据Zomato API文档,响应看起来像这样 -

     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();
                                    }
                                });
                            }
                        }
                    });
        }

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

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

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

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

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

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

  }
},
"7": {

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

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

  }
}

而且RestaurantDetails类包含“restaurant”标签内的所有内容。我的问题如何表示我的Model类中的JsonResponse中出现的“1”,“2”,“3”等。

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

3 个答案:

答案 0 :(得分:1)

以Json格式

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

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

         }
      }
   }
}

对应一个对象&#34; nearby_restaurants&#34;包含两个对象&#34; 1&#34;和&#34; 2&#34;两者都包含对象&#34; restaurant&#34;空值。

您正在尝试填充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 :(得分:0)

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

答案 2 :(得分:0)

公开 列表&lt; RestaurantDetails&gt; 餐厅;返回数组

公共 RestaurantDetails 餐厅; return Object

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

试试这个!!

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

<强> 更新

你的Json String返回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
}
 });