Как разобрать 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, если это имеет какое-либо значение.
7 ответов:
две вещи, которые можно сделать более эффективно:
- использовать
StringBuilder
вместоStringBuffer
так как это быстрее и младшего брата.- использовать
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 и довольно быстро. С другой стороны, это дополнительная банка, чтобы включить с вашим приложением, увеличивая загрузку и размер на флэш-памяти.
вместо
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 commons.
для Android, и с помощью Apache Commons IO библиотека
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