Intereting Posts
Как обнаружить одно касание, а также multi-touch в onTouchEvent () Как работает OpenUDID Список слоев xml для Android не отображается корректно на некоторых устройствах Как открыть любое приложение из моего браузера (Chrome) в Android? Что мне нужно сделать с ссылкой A Href? Как свернуть анимацию AppBarLayout без нажатия на содержимое, похожее на WhatsApp Android? VerifyError с использованием Mockito 1.9.5 и DexMaker-Mockito-1.0 Как переопределить шифрованный список, отправленный на сервер Android при использовании HttpsURLConnection? Java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager facebook android app Отладка файлов сборки Gradle в Intellij / Android Studio Запись ресурса com.crashlytics.android.build_id уже определена Запустить приложение / намерение Android из тега NFC? Центрирование текстового изображения Ниже кнопки изображения, которая находится под относительным расположением? Прослушиватель событий Android для жизненного цикла приложения Как отключить ответы на Crashlytics? Как получить код страны ISO в приложениях для Android?

Как разобрать 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);