web-dev-qa-db-fra.com

Comment analyser le code JSON à partir d'un Java HTTPResponse?

J'ai un objet HttpResponse pour une requête Web que je viens de faire. La réponse est au format JSON, je dois donc l’analyser. Je peux le faire d'une manière absurdement complexe, mais il me semble qu'il doit y avoir un meilleur moyen.

Est-ce vraiment le mieux que je puisse faire?

    HttpResponse response; // some response object
    Reader in = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    StringBuilder builder= new StringBuilder();
    char[] buf = new char[1000];
    int l = 0;
    while (l >= 0) {
        builder.append(buf, 0, l);
        l = in.read(buf);
    }
    JSONTokener tokener = new JSONTokener( builder.toString() );
    JSONArray finalResult = new JSONArray( tokener );

Je suis sur Android si cela fait une différence.

71
Joe Ludwig

Deux choses qui peuvent être faites plus efficacement:

  1. Utilisez StringBuilder au lieu de StringBuffer car c'est le frère le plus rapide et le plus jeune.
  2. Utilisez BufferedReader#readLine() pour le lire ligne par ligne au lieu de le lire caractère par caractère.

HttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String line = null; (line = reader.readLine()) != null;) {
    builder.append(line).append("\n");
}
JSONTokener tokener = new JSONTokener(builder.toString());
JSONArray finalResult = new JSONArray(tokener);

Si le JSON est en réalité une seule ligne, vous pouvez également supprimer la boucle et le générateur.

HttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
JSONTokener tokener = new JSONTokener(json);
JSONArray finalResult = new JSONArray(tokener);
83
BalusC

Utilisez JSON Simple,

http://code.google.com/p/json-simple/

Qui a une petite empreinte, pas de dépendances, donc parfait pour Android.

Vous pouvez faire quelque chose comme ça,

Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
9
ZZ Coder

Vous pouvez utiliser la bibliothèque Gson pour analyser

void getJson() throws IOException {
    HttpClient  httpClient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet("some url of json");
    HttpResponse httpResponse = httpClient.execute(httpGet);
    String response = EntityUtils.toString(httpResponse.getEntity());

    Gson gson = new Gson();
    MyClass myClassObj = gson.fromJson(response, MyClass.class);

}

voici un exemple de fichier json qui est fetchd du serveur

{
"id":5,
"name":"KitKat",
"version":"4.4"
}

voici ma classe

class MyClass{
int id;
String name;
String version;
}

se référer this

5
Rajesh Batth

Jackson semble prendre en charge une partie de l'analyse JSON directement à partir d'un InputStream. Si j'ai bien compris, il fonctionne sous Android et est assez rapide. Par contre, il s'agit d'un fichier JAR supplémentaire à inclure dans votre application, ce qui augmente le téléchargement et la taille de la mémoire flash.

2
CommonsWare

Pour Android, et en utilisant la bibliothèque Commons IO pour IOUtils:

// connection is a HttpURLConnection
InputStream inputStream = connection.getInputStream()
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(inputStream, baos);
JSONObject jsonObject = new JSONObject(baos.toString()); // JSONObject is part of Android library
0
Jonathan Lin

Au lieu de faire

Reader in = new BufferedReader(
    new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder= new StringBuilder();
char[] buf = new char[1000];
int l = 0;
while (l >= 0) {
    builder.append(buf, 0, l);
    l = in.read(buf);
}
JSONTokener tokener = new JSONTokener( builder.toString() );

Tu peux faire:

JSONTokener tokener = new JSONTokener(
                           IOUtils.toString(response.getEntity().getContent()) );

où IOUtils est issu de la bibliothèque de communes IO.

0
Jove Kuang