2016-03-19 1 views
-2

Je me bats avec un certain problème lié à http, java et l'API StackExchange considèrent l'adresse suivante en tant que chaîne:Parsing Demande JSON avec API StackExchange

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

si j'écris cette url dans mon navigateur je reçois cette réponse comme JSON:

enter image description here

maintenant im essayant de le faire avec java et seulement libs indigènes, pour que je les utilise l'extrait ci-dessous Wich travaille à ce jour si bon ...

Si je parser le JSON et je tente d'obtenir la valeur de la clé « country_name » puis les imprime snippet comme spected « Singapour »

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

Ma question:

si je faire la même chose avec ce lien https://api.stackexchange.com//2.2/users/22656?order=desc&sort=reputation&site=stackoverflow&filter=!T6oHjO_RIWkfWpoL5g

mon navigateur affiche le JSON suivant:

enter image description here

mais si je tente d'analyser le JSON je reçois une exception parce que je reçois de la demande ceci:

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

pour quelque chose qui est même pas lisible par l'homme ...

savez-vous pourquoi?

Merci à l'avance

Répondre

1

L'API StackOverflow GZIP-compriment sa réponse. La raison pour laquelle vous voyez cette chaîne de caractères non lisibles par un humain est que vous essayez de lire des données compressées par GZIP sans d'abord le décompresser.

Votre navigateur est capable de lire cet en-tête et de faire la décompression elle-même. Votre code n'est pas encore.

Vous pouvez confirmer que la compression GZIP est utilisée en affichant la valeur du Content-Encoding header dans la réponse. Ajout de la ligne

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

va imprimer

gzip 

Heureusement, régler le problème est assez simple. Vous avez besoin d'envelopper le InputStream que vous obtenez de la demande dans un GZIPInputStream:

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

Cependant, au lieu des classes Java intégré, je vous recommande d'utiliser une bibliothèque telle que Apache HTTPComponents Client pour faire vos requêtes HTTP. En particulier, une telle librairie détectera automatiquement l'encodage du contenu et fera la décompression pour vous.

+0

Parfaitement expliqué ... merci ... –