2016-05-06 2 views
0

Ich bin ziemlich neu in der Android-Entwicklung und erstelle eine App, für die ich den Zomato verwenden muss Rest-API Ich verwende die Koush ION-Bibliothek https://github.com/koush/ion zum Senden der http-Anfrage und zum Empfangen einer Antwort. Zur Verwendung dieser Bibliothek erstelle ich einfach eine Java-Modellklasse mit den Schlüsseln als Java-Instanzvariablen und rufe diese Codezeile auf.Android-Modell für die JSON-Analyse zeigt ClassCastException: com.google.gson.JsonObject kann nicht in com.google.gson.JsonArray umgewandelt werden

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

Gemäß der Zomato API-Dokumentation wird die Antwort in etwa so aussehen -

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

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

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

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

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

    } 
}, 
"7": { 

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

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

    } 
} 

Und meine RestaurantZomato Klasse sieht wie folgt aus -

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

Und RestaurantDetails Klasse hat im Inneren alles das "Restaurant" -Tag. Meine Frage, wie man "1", "2", "3" usw. darstellt, das in der JsonResponse in meiner Modelklasse vorhanden ist.

Es tut mir leid, wenn diese Frage dumm ist. Wie gesagt, ich bin neu in der Android-Entwicklung und alle Ressourcen, die mich in die richtige Richtung weisen, werden sehr geschätzt!

+0

Add Gson 2.2.3.jar Bibliothek in Ihrem Projekt –

+0

@DaminiMehra verwenden Sie für Ihren Kommentar danken. Allerdings hat meine Klasse import com.google.gson.Gson; importieren com.google.gson.JsonArray; importieren com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; bedeutet das nicht, dass die Bibliothek bereits vorhanden ist? –

Antwort

0

public Liste < RestaurantDetails> Restaurant; Rückgabe Array

öffentlich RestaurantDetails Restaurant; Rückgabeobjekt

Ihr API-Rückgabeobjekt. Nicht zurück Array

Versuchen Sie es !!

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

aktualisieren

Ihre Json String JsonObject zurück.Sie müssen 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

Hallo! Danke für Ihre Antwort. Ich habe es versucht. Allerdings bekomme ich immer noch den gleichen Fehler. Ich denke, es hat etwas mit der "1", "2", "3" in der JSON-Antwort zu tun, da das Restaurant-Objekt in einem anderen JSON-Objekt ist. Ich kann nicht verstehen, wie man eine Instanzvariable dafür erstellt. –

+0

Ich aktualisiere meine Antwort –

+0

Vielen Dank! Das hat mein Problem gelöst! –

0

Das Problem ist, dass Sie ein JSON-Objekt in "closed_restaurants" erhalten und versuchen, es als JSONArray abzurufen. Wie Sie in der Zomato-Antwort sehen können, gibt es kein [], daher gibt es keine json-array-only-Objekte.

+0

Vielen Dank für die einfache und klare Unterscheidung zwischen JSON-Objekt und Array. Wie auch immer es zum öffentlichen Restaurant wechseltDetails Restaurant; hat mein Problem nicht gelöst. Ich bekomme immer noch den gleichen Fehler. –

1

Im Json Format Dieses

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

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

     } 
     } 
    } 
} 

auf ein Objekt „nearby_restaurants“ entspricht, die zwei Objekte „1“ und „2“ enthält, dass sowohl das Objekt „Restaurant“ mit leerem Wert enthält.

Sie versuchen, ein Java-List-Objekt zu füllen, aber in Ihrem Json existiert keine Liste oder Array!

Betrachten Sie this und this und Sie werden Ihr Problem lösen. :-)

EDIT

versuchen diesen 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

Danke für diese Links! Ich bin mir jedoch immer noch nicht sicher, wie ich die Schlüsselwerte "1", "2", "3" usw. in meinem Modell darstellen soll, da mein Modell den Schlüsselwert des JSON als den Namen der Instanzvariable nimmt. Wenn der JSON beispielsweise {"Benutzername": "viji"} ist, hat mein Modell einen öffentlichen String-Benutzernamen; –

Verwandte Themen