2016-03-19 8 views
-2

ich mit einigem Problem mit http, Java und der Stack API verwandt bin kämpfen die folgende URL als String betrachten:Parsing Antrag als Json mit Stack API

private static final String URLSTRING_2 = "http://freegeoip.net/json/"; 

wenn ich diese URL in meinem Browser schreibe ich bekomme diese Antwort als json:

enter image description here

jetzt im mit Java und nur native Bibliotheken zu tun versuchen, dass, denn das ist das snippet unten Weichen verwende funktioniert so weit, so gut ...

Wenn ich analysieren, um die json und ich versuche, den Wert für den Schlüssel „country_name“, um dann die Schnipsel gibt als spected „Singapur“

public static void main(String[] args) throws Exception { 

    // Connect to the URL using java's native library 
    final URL url = new URL(URLSTRING_2); 
    final HttpURLConnection request = (HttpURLConnection) url.openConnection(); 
    request.connect(); 

    // Convert to a JSON object to print data 
    final JsonParser jp = new JsonParser(); // from gson 
    final JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); // Convert the input stream to a json 
                            // element 
    final JsonObject rootobj = root.getAsJsonObject(); // May be an array, may be an object. 
    final String country = rootobj.get("country_name").getAsString(); // just grab the zipcode 
    System.out.println("country_name: " + country); 
} 

Meine Frage ist jetzt:

wenn ich das gleiche tun mit diesem Link https://api.stackexchange.com//2.2/users/22656?order=desc&sort=reputation&site=stackoverflow&filter=!T6oHjO_RIWkfWpoL5g

meinem Browser die folgende json ausgibt:

enter image description here

aber wenn ich versuche, die json ich eine Ausnahme erhalten zu analysieren, weil ich von der Anfrage bekommen dies:

ý • @ ‡ ž¼ÚRìØ1ôX` »V ± h [<- ¹ '/ + OI £ • ........

für etwas, das nicht einmal für Menschen lesbaren ...

ist wissen Sie, warum?

Vielen Dank im Voraus

Antwort

1

Die API Stackoverflow GZIP-komprimiert seine Antwort. Der Grund, warum Sie diese Zeichenfolge nicht lesbarer Zeichen sehen, besteht darin, dass Sie versuchen, GZIP-komprimierte Daten zu lesen, ohne sie zuvor zu dekomprimieren.

Ihr Browser kann diesen Header lesen und die Dekomprimierung selbst durchführen. Dein Code ist noch nicht.

Sie können bestätigen, dass die GZIP-Komprimierung verwendet wird, indem Sie den Wert Content-Encoding header in der Antwort anzeigen. Hinzufügen der Zeile

System.out.println(request.getContentEncoding()); 

wird auszudrucken

gzip 

Glücklicherweise das Problem zu lösen ist recht unkompliziert. Sie müssen die InputStream Sie von der Anfrage in einem GZIPInputStream erhalten wickeln:

final JsonElement root = jp.parse(new InputStreamReader(new GZIPInputStream((InputStream) request.getContent()))); // Convert the input stream to a json 

Doch statt der integrierten Java-Klassen, ich würde empfehlen, eine Bibliothek wie Apache HTTPComponents Client für die Herstellung Ihrer HTTP-Anfragen verwenden. Insbesondere wird eine Bibliothek wie diese automatisch die Inhaltscodierung erkennen und die Dekomprimierung für Sie durchführen.

+0

Perfekt erklärt ... Danke ... –