Как разобрать JSON из Java HTTPResponse?

У меня есть объект HttpResponse для только что сделанного веб-запроса. Ответ находится в формате JSON, поэтому мне нужно его разобрать. Я могу сделать это абсурдно сложным образом, но похоже, что должен быть лучший способ.

Это действительно лучшее, что я могу сделать?

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

Я на Android, если это имеет значение.

Solutions Collecting From Web of "Как разобрать JSON из Java HTTPResponse?"

Две вещи, которые можно сделать более эффективно:

  1. Используйте StringBuilder вместо StringBuffer так как это более быстрый и младший брат.
  2. Используйте BufferedReader#readLine() чтобы читать его по строкам, а не читать его char по 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); 

Если JSON на самом деле является одной строкой, вы также можете удалить цикл и построитель.

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

Используйте JSON Simple,

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

Который имеет небольшую фут-печать, без зависимостей, поэтому идеально подходит для Android.

Вы можете сделать что-то подобное,

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

Вы можете использовать библиотеку Gson для синтаксического анализа

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

Здесь находится образец json-файла, который является fetchd с сервера

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

Вот мой класс

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

Обратитесь к этому

Джексон, похоже, поддерживает некоторое количество JSON, анализируя прямо из InputStream . Я понимаю, что он работает на Android и довольно быстро. С другой стороны, это дополнительный JAR, который можно включить в приложение, увеличивая размер загрузки и на флеш-памяти.

Вместо того, чтобы делать

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

Ты можешь сделать:

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

Где IOUtils – из общей библиотеки IO.

Для Android и использование библиотеки IO IOUtils 's Commons для 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 

Нет необходимости делать цикл читателя самостоятельно. JsonTokener имеет встроенную систему.

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