Как разобрать 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, если это имеет значение.
Ответы
Ответ 1
Две вещи, которые можно сделать более эффективно:
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);
Ответ 2
Использовать JSON Simple,
http://code.google.com/p/json-simple/
У которого есть небольшая отпечатка, без зависимостей, поэтому он идеально подходит для Android.
Вы можете сделать что-то вроде этого,
Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
Ответ 3
Вы можете использовать библиотеку 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;
}
отсылайте this
Ответ 4
Jackson, похоже, поддерживает некоторое количество разбора JSON прямо с InputStream
. Я понимаю, что он работает на Android и довольно быстро. С другой стороны, это дополнительный JAR, который можно включить в приложение, увеличивая размер загрузки и на флеш-памяти.
Ответ 5
Вместо того, чтобы делать
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.
Ответ 6
Для 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
Ответ 7
Нет необходимости делать цикл читателя самостоятельно. JsonTokener имеет это встроенное устройство. Например,
ttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new
JSONTokener tokener = new JSONTokener(reader);
JSONArray finalResult = new JSONArray(tokener);