2017-08-06 37 views
3

Ich entwickle eine App auf der Android-Plattform, die Youtube-Video-Suchergebnisse als JSON-Format erhält und den Titel, den Kanalnamen und die Thumbnail-URL in eine Listenansicht einfügt. Ich sollte auch hinzufügen, dass ich die jsoup-Bibliothek für Android verwende. So ziemlich verbinde ich mich mit einer URL, die eine JSON-Antwort enthält, und versuche, Werte aus dieser Antwort zu verwenden und sie auf eine Listenansicht anzuwenden. Hier ist die Methode.JSON Exception - Kein Wert für gewünschte Parameter

public void initSearch(String searchQuery) { 
    String url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=1&order=rating&q=" + searchQuery + "&key=MY_GOOGLE_API_KEY"; 

    try { 
     Document doc = Jsoup.connect(url).ignoreContentType(true).timeout(10 * 1000).get(); 
     String getJson = doc.text(); 

     try{ 
      JSONObject jsonObject = (JSONObject) new JSONTokener(getJson).nextValue(); 

      String videoId = jsonObject.getString("videoId"); 
      String thumbnail = "http://img.youtube.com/vi/" + videoId + "/mqdefault.jpg"; 
      String title = (String)jsonObject.get("title"); 
      String channelTitle = (String)jsonObject.get("channelTitle"); 

      VideoDetails videoDetails = new VideoDetails(thumbnail, title,channelTitle,"6,900"); 
      searchedList.add(videoDetails); 
     } catch (JSONException e){ 
      e.printStackTrace(); 
     } 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 
} 

Here ist, was die Webseite, die ich verbinde, aussieht.

Ich habe bereits überprüft, ob es gültiges JSON-Format ist, und ja, es ist.

Jetzt ist das Problem, nichts wird tatsächlich meiner Listenansicht hinzugefügt. Wenn diese Methode aufgerufen wird, erhalte ich einen Fehler, der so aussieht.

W/System.err: org.json.JSONException: No value for videoId 

Wer weiß, was los ist? Danke im Voraus.

+0

was Search Wert? Ich möchte es testen. – redAllocator

+0

Der searchQuery-Wert stammt aus einer SearchView, die ich in die MainActivity implementiert habe. Ich habe nur "Hunde" als Suchbegriff verwendet. – Mason

+0

Denken Sie daran, dass Sie den API-Schlüssel am Ende der URL ändern müssen, um eine autorisierte Anfrage zu erhalten. – Mason

Antwort

2

Die videoId ist ein Unterelement im JSON, daher müssen Sie das JSON durchlaufen, um es zu erhalten.

Bad Art und Weise (die hart codierte Index beachten):

String videoID = (String) ((JSONObject) ((JSONObject) jsonObject.getJSONArray("items").get(0)).get("id")).get("videoId"); 
System.out.println(videoID); 

Bevorzugte Art und Weise:

Iterator<?> keys = jsonObject.keys(); 

/* Iterate over all the elements and sub-elements and assign as 
* needed. Based on the type you can concert each item to a JSONObject or 
* JSONArray, etc. 
*/ 
while (keys.hasNext()) { 
    String key = (String) keys.next(); 

    System.out.println(key + "\t" + jsonObject.get(key) + "\t" + jsonObject.get(key).getClass()); 
} 
+1

danke, ich bin sehr neu in JSON, also weiß ich nicht wirklich, wie ich darin navigieren soll. Als ich Ihren bevorzugten Weg im Debugger fand, bemerkte ich, dass einige der zurückgegebenen Klassen sich von den anderen unterscheiden. Genauer gesagt, der Schlüssel "Elemente" ist als JSONArray markiert. Wie navigiere ich durch das? verschachtelte While-Schleifen? Wenn es möglich ist, könntest du mir einen Quellcode schicken? Nochmals, vielen Dank, dass ich meinen Wunschwerten viel näher komme. – Mason

+0

@Mason JSONArray verhält sich wie eine Liste, wenn Sie also eine finden, können Sie sie einer JSONArray-Variablen zuweisen und Methoden wie "size" und "get" verwenden, die Sie in einer Schleife verwenden können, um alle Werte zu erhalten. 'JSONArray a = (JSONArray) jsonObject.get (Schlüssel);' – tima

+1

Ich konnte es zum Laufen bringen. Danke für die Hilfe – Mason

Verwandte Themen