¿Cómo analizo JSON desde una HTTPResponse de Java?

Tengo un objeto HttpResponse para una solicitud web que acabo de hacer. La respuesta está en formato JSON, así que necesito analizarlo. Puedo hacerlo de una manera absurdamente compleja, pero parece que debe haber una mejor manera.

¿Es esto realmente lo mejor que puedo hacer?

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

Estoy en Android si eso hace la diferencia.

Dos cosas que se pueden hacer de manera más eficiente:

  1. Usa StringBuilder lugar de StringBuffer ya que es el hermano más rápido y más joven.
  2. Use BufferedReader#readLine() para leerlo línea por línea en lugar de leerlo char por char.

 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 el JSON es en realidad una sola línea, también puede eliminar el bucle y el generador.

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

Use JSON Simple,

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

Que tiene una pequeña huella, sin dependencias, por lo que es perfecto para Android.

Puedes hacer algo como esto,

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

Puede usar la biblioteca Gson para analizar

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

aquí está el archivo json de muestra que se obtiene del servidor

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

aquí está mi clase

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

referir esto

Jackson parece soportar una cierta cantidad de análisis JSON directamente desde un InputStream . Según tengo entendido, funciona en Android y es bastante rápido. Por otro lado, es un JAR extra para incluir con su aplicación, aumentando la descarga y el tamaño de flash.

En lugar de hacer

 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 puedes hacer:

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

donde IOUtils es de la biblioteca IO de los comunes.

Para Android, y utilizando la Biblioteca de IO Commons de Apache para 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 

No hay necesidad de hacer el ciclo de lectura usted mismo. El JsonTokener tiene esto incorporado. Ej.

 ttpResponse response; // some response object BufferedReader reader = new BufferedReader(new JSONTokener tokener = new JSONTokener(reader); JSONArray finalResult = new JSONArray(tokener);