2016-05-06 1 views
0

Я довольно новичок в разработке Android, и я создаю приложение, которое требует, чтобы я потреблял Zomato Rest API. Я использую библиотеку Koush ION https://github.com/koush/ion для отправки HTTP-запроса и получения ответа. Для использования этой библиотеки я просто создаю класс java-класса с ключами как переменные экземпляра java и вызываю эту строку кода.Модель Android для анализа JSON показывает ClassCastException: com.google.gson.JsonObject не может быть отправлен в com.google.gson.JsonArray

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

В соответствии с документацией API Zomato, реакция будет выглядеть следующим образом -

{"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 класс имеет все внутри тег «ресторан». Мой вопрос, как представлять «1», «2», «3» и т. Д., Который присутствует в JsonResponse в моем классе Model.

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

+0

добавить gson библиотеку 2.2.3.jar в проекте –

+0

@DaminiMehra Спасибо за ваш комментарий. Однако у моего класса есть импорт com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; не означает ли это, что библиотека уже присутствует? –

ответ

0

общественного Список < RestaurantDetails> ресторан; return Array

общественное мнение ресторанподробнее ресторан; return Объект

Ваш объект возврата API. Не возвращать Array

Попробуйте это!

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

Update

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

Привет! Спасибо за ваш ответ. Я попробовал это. Однако я все еще получаю ту же ошибку. Я думаю, что это имеет какое-то отношение к «1», «2», «3» в ответе JSON, поскольку объект ресторана находится внутри другого объекта JSON. Я не могу понять, как создать для него переменную экземпляра. –

+0

Я обновляю свой ответ –

+0

Большое вам спасибо! Это решило мою проблему! –

0

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

+0

Благодарим вас за простое и четкое различие между объектом JSON и массивом. Однако сменив его на публичный ресторан RestaurantDetails; не решила мою проблему. Я все еще получаю ту же ошибку. –

1

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

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

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

     } 
     } 
    } 
} 

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

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

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

EDIT

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

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

Спасибо за эти ссылки! Однако я до сих пор не знаю, как представить ключевые значения «1», «2», «3» и т. Д. В моей модели, так как моя модель принимает ключевое значение JSON в качестве имени переменной экземпляра. Например, если JSON является {"Username": "viji"}, то моя модель имеет общедоступное имя String; –

Смежные вопросы