Модель Android для анализа JSON показывает исключение ClassCastException: com.google.gson.JsonObject, которое нельзя преобразовать в com.google.gson.JsonArray.

Я довольно новичок в разработке для Android и создаю приложение, которое требует от меня использования API Zomato Rest. Я использую библиотеку 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". Мой вопрос, как представить "1", "2", "3" и т. Д., Который присутствует в JsonResponse в моем классе Model.

Извините, если этот вопрос глупый. Как я уже сказал, я новичок в разработке для Android, и любые ресурсы, которые указывают мне правильное направление, будут высоко оценены!

3 ответа

Решение

Общедоступный список ресторана; вернуть массив

общественный ресторандетали ресторан; вернуть объект

Ваш 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
}
 });

В формате Json это

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

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

         }
      }
   }
}

соответствует объекту "near_restaurants", который содержит два объекта "1" и "2", и оба содержат объект "restaurant" с пустым значением.

Вы пытаетесь заполнить объект списка Java, но в вашем Json не существует ни списка, ни массива!

Посмотрите на это и это, и вы решите свою проблему.:-)

РЕДАКТИРОВАТЬ

попробуй этот код

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

Проблема в том, что вы получаете JSON-объект внутри "near_restaurants" и пытаетесь получить его как JSONArray. Как вы можете видеть в ответе Zomato, нет [], поэтому нет только массива json объектов.

Другие вопросы по тегам