102 votes

Obtenir un objet JSON à partir d'une réponse HTTP

Je veux obtenir un JSON à partir d'une réponse Http get :

Voici mon code actuel pour le Http get :

protected String doInBackground(String... params) {

    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(params[0]);
    HttpResponse response;
    String result = null;
    try {
        response = client.execute(request);         
        HttpEntity entity = response.getEntity();

        if (entity != null) {

            // A Simple JSON Response Read
            InputStream instream = entity.getContent();
            result = convertStreamToString(instream);
            // now you have the string representation of the HTML request
            System.out.println("RESPONSE: " + result);
            instream.close();
            if (response.getStatusLine().getStatusCode() == 200) {
                netState.setLogginDone(true);
            }

        }
        // Headers
        org.apache.http.Header[] headers = response.getAllHeaders();
        for (int i = 0; i < headers.length; i++) {
            System.out.println(headers[i]);
        }
    } catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return result;
}

Voici la fonction convertSteamToString :

private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

Pour l'instant, je n'obtiens qu'un objet de type chaîne. Comment puis-je récupérer un objet JSON ?

79voto

Renan Bandeira Points 888

La chaîne que vous obtenez est juste l'objet JSON.toString(). Cela signifie que vous obtenez l'objet JSON, mais dans un format String.

Si vous êtes censé obtenir un objet JSON, vous pouvez simplement mettre :

JSONObject myObject = new JSONObject(result);

0 votes

Et si en cas de HttpExchange ?

0 votes

@Renan Bandeira J'essaie votre code pour convertir ma réponse http en un objet json et j'obtiens cette erreur Error:(47, 50) java: incompatible types: java.lang.StringBuffer cannot be converted to java.util.Map

0 votes

@Karapapas pouvez-vous montrer votre code ? Ma réponse date de 2013. Je vous recommanderais d'utiliser quelque chose comme Retrofit et Gson/Jackson pour traiter les demandes et la sérialisation Json.

13voto

rockstar Points 1038

Faites ceci pour obtenir le JSON

String json = EntityUtils.toString(response.getEntity());

Plus de détails ici : récupérer le json de la réponse HttpResponse

40 votes

Qui est un Chaîne de caractères pas un JSON !

8 votes

Pourquoi est-ce que ça a autant de votes positifs ? C'est juste un toString() fonction - en gros la même chose que ce que fait le PO.

1 votes

Au moins, cela permet de se débarrasser d'une grande partie du code de bas niveau de l'OP. Voir le post de @Catalin Pirvu ci-dessous pour une solution plus complète.

12voto

Ce n'est pas la réponse exacte à votre question, mais cela peut vous aider.

public class JsonParser {

    private static DefaultHttpClient httpClient = ConnectionManager.getClient();

    public static List<Club> getNearestClubs(double lat, double lon) {
        // YOUR URL GOES HERE
        String getUrl = Constants.BASE_URL + String.format("getClosestClubs?lat=%f&lon=%f", lat, lon);

        List<Club> ret = new ArrayList<Club>();

        HttpResponse response = null;
        HttpGet getMethod = new HttpGet(getUrl);
        try {
            response = httpClient.execute(getMethod);

            // CONVERT RESPONSE TO STRING
            String result = EntityUtils.toString(response.getEntity());

            // CONVERT RESPONSE STRING TO JSON ARRAY
            JSONArray ja = new JSONArray(result);

            // ITERATE THROUGH AND RETRIEVE CLUB FIELDS
            int n = ja.length();
            for (int i = 0; i < n; i++) {
                // GET INDIVIDUAL JSON OBJECT FROM JSON ARRAY
                JSONObject jo = ja.getJSONObject(i);

                // RETRIEVE EACH JSON OBJECT'S FIELDS
                long id = jo.getLong("id");
                String name = jo.getString("name");
                String address = jo.getString("address");
                String country = jo.getString("country");
                String zip = jo.getString("zip");
                double clat = jo.getDouble("lat");
                double clon = jo.getDouble("lon");
                String url = jo.getString("url");
                String number = jo.getString("number");

                // CONVERT DATA FIELDS TO CLUB OBJECT
                Club c = new Club(id, name, address, country, zip, clat, clon, url, number);
                ret.add(c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // RETURN LIST OF CLUBS
        return ret;
    }

}
Again, it’s relatively straight forward, but the methods I’ll make special note of are:

JSONArray ja = new JSONArray(result);
JSONObject jo = ja.getJSONObject(i);
long id = jo.getLong("id");
String name = jo.getString("name");
double clat = jo.getDouble("lat");

10voto

Joe Birch Points 366

Sans un regard sur votre sortie JSON exacte, il est difficile de vous donner un code de travail. Ce site est très utile, mais vous pourriez utiliser quelque chose du genre :

JSONObject jsonObj = new JSONObject("yourJsonString");

Ensuite, vous pouvez récupérer cet objet json en utilisant :

String value = jsonObj.getString("yourKey");

1 votes

Très beau tutoriel. "En général, tous les nœuds JSON commencent par un crochet ou par une accolade. La différence entre [ et { est que le crochet ([) représente le début d'un nœud JSONArray alors que le crochet ({) représente JSONObject. Ainsi, en accédant à ces nœuds, nous devons appeler la méthode appropriée pour accéder aux données. Si votre nœud JSON commence par [, alors nous devons utiliser la méthode getJSONArray(). De même, si le nœud commence par {, nous devons utiliser la méthode getJSONObject()."

6voto

Catalin Pirvu Points 136

Dans le but de trouver une solution complète à ce problème (oui, je sais que ce post est mort depuis longtemps...) :

Si vous voulez un JSONObject alors obtenez d'abord un String de la result :

String jsonString = EntityUtils.toString(response.getEntity());

Alors vous pouvez obtenir votre JSONObject :

JSONObject jsonObject = new JSONObject(jsonString);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X