2017-03-04 1 views
0

Ich habe diesen Code:Wie analysiert man die Google Custom Search API-Antwort in Java?

public void googleSearch() throws Exception { 

    URL url = new URL(
      "https://www.googleapis.com/customsearch/v1?key=" + key + "&cx=" + cx + "&q=" + qry + "&alt=json&queriefields=queries(request(totalResults))"); 

    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("GET"); 
    conn.setRequestProperty("Accept", "application/json"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream()))); 

    ObjectMapper mapper = new ObjectMapper(); 

    System.out.println("Output from Server .... \n"); 
    while ((output = br.readLine()) != null) { 
     Object obj = mapper.readValue(output, Object.class); 
     System.out.println(obj); 

    } 

    conn.disconnect(); 
} 

Wo Ich versuche, die JSON-Antwort von Google mit Jackson 2 zu analysieren, verwalten die Daten zurückgegeben. Ich brauche nur Bild-Links und Beschreibungen, aber ich kann überhaupt keine geparsten Daten bekommen. Ich bekomme diese Fehlermeldung, wenn ich diesen Code ausführen:

com.fasterxml.jackson.core.io.JsonEOFException: Unexpected end-of-input: expected close marker for Object (start marker at [Source: {; line: 1, column: 1]) 
at [Source: {; line: 1, column: 3] 

Wie trenne ich die Bild-Links und Informationen, die ich brauche und machen es besser handhabbar? (Ich nehme an, indem ich den JSON in ein Java-Objekt analysiere und dann die Objektvariablen aufrufen kann, aber nicht genau weiß, wie genau)

Antwort

0

Sie lesen die Antwort Zeile für Zeile und senden jede Zeile individuell zu Jackson. so, wenn die Antwort so etwas wie dies

ist
{ 
    "property1": "value1" 
    ... 
} 

Jackson bekommt einen Eingang json String "{" und das ist natürlich ungültig.

Sie sollten die ganze conn.getInputStream() nach Jackson senden (und sicher genug, ObjectMapper hat eine solche api)

und wenn wir schon dabei sind, ist parsong in eine Object keine gute Idee, da der ganze Sinn von Jackson data bind api bindet den json in eine konkrete Java-Klasse (normalerweise benutzerdefiniert). Wenn Sie wirklich in einem Mehrzweckbehälter analysieren wollen, ein Map in Jackson senden:

Map<String, Object> map = mapper.readValue(conn.getInputStream(), Map.class); 

... dann wird System.out.println auch richtig funktionieren.

eine andere Option ist Anruf readTree() und verwenden Sie die JsonNode Allzweck-Datenstruktur.

und während wir dabei sind, anstatt lange JSON-Strukturen zu analysieren, haben Sie in Google API Client Library for Java untersucht?

+0

Wie würde ich die Werte aus dem JSON abrufen? Ich habe über die Verwendung eines Schlüssels gelesen, aber ich weiß nicht, welche Schlüssel in der Google-Antwort enthalten sind. Ich habe versucht, System.out.println (map.get ("src")); Aber es druckt nur Null. – QQuestions

+0

Drucken Sie die Karte. Es wird Ihnen sagen, welche Schlüssel und Werte es enthält –

Verwandte Themen