2016-05-06 1 views
0

Je suis assez nouveau pour le développement Android et je crée une application qui me demande de consommer le Zomato Reste l'API. J'utilise la bibliothèque KONH ION https://github.com/koush/ion pour envoyer la requête http et recevoir une réponse. Pour utiliser cette bibliothèque, je crée simplement une classe java modèle avec les clés en tant que variables d'instance Java et j'appelle cette ligne de code.Modèle Android pour les expositions d'analyse JSON ClassCastException: com.google.gson.JsonObject ne peut pas être casté en 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(); 
            } 
           }); 
          } 
         } 
        }); 
     } 

Selon la documentation de l'API Zomato, la réponse ressemblera à quelque chose comme ça -

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

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

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

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

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

    } 
}, 
"7": { 

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

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

    } 
} 

Et ma classe RestaurantZomato ressemble à ceci -

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

Et RestaurantDetails a tout à l'intérieur le tag "restaurant". Ma question comment représenter "1", "2", "3" etc qui est présent dans le JsonResponse dans ma classe Model.

Je suis désolé si cette question est stupide. Comme je l'ai dit je suis nouveau sur le développement Android et toutes les ressources qui me pointent dans la bonne direction seront très appréciées!

+0

add gson bibliothèque 2.2.3.jar dans votre projet –

+0

@DaminiMehra Merci pour votre commentaire. Cependant, ma classe a import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; cela ne signifie-t-il pas que la bibliothèque est déjà présente? –

Répondre

0

publique Liste < RestaurantDetails> un restaurant; retour Array

public RestaurantDétails restaurant; return Object

Votre API renvoie l'objet. Ne pas retourner Array

Essayez ceci !!

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

Mise à jour

Votre Json chaîne retour JsonObject.Vous devez utiliser 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

Bonjour! Merci pour votre réponse. J'ai essayé ça. Cependant, je reçois toujours la même erreur. Je pense que cela a quelque chose à voir avec le "1", "2", "3" dans la réponse JSON puisque l'objet restaurant est dans un autre objet JSON. Je ne peux pas comprendre comment créer une variable d'instance pour cela. –

+0

Je mets à jour ma réponse –

+0

Merci beaucoup! Cela a résolu mon problème! –

0

Le problème est que vous recevez un objet JSON dans "nearby_restaurants" et que vous essayez de le récupérer en tant que JSONArray. Comme vous pouvez le voir dans la réponse de Zomato, il n'y a pas de [] donc il n'y a pas d'objets de tableau json seulement.

+0

Merci pour la distinction simple et claire entre l'objet JSON et le tableau. Cependant en le changeant au restaurant publicDetails de restaurant; n'a pas résolu mon problème. Je reçois toujours la même erreur. –

1

Dans le format Json ce

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

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

     } 
     } 
    } 
} 

correspond à un objet « nearby_restaurants » qui contient deux objets « 1 » et « 2 » qui contient à la fois l'objet « restaurant » avec une valeur vide.

Vous essayez de remplir un objet Liste Java, mais dans votre Json n'existe aucune liste ou tableau! Voir this et this et vous permettra de résoudre votre problème. :-)

EDIT

essayer ce code

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

Merci pour ces liens! Cependant, je ne suis toujours pas sûr de la façon de représenter les valeurs clés "1", "2", "3" etc. dans mon modèle puisque mon Modèle prend la valeur clé du JSON comme nom de variable d'instance. Par exemple si le JSON est {"Username": "viji"} alors mon modèle a public String Username; –