Как мне разобрать JSON из Java HTTPResponse? - PullRequest
71 голосов
/ 17 мая 2010

У меня есть объект 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 ]

83 голосов
/ 17 мая 2010

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

  1. Используйте StringBuilder вместо StringBuffer, так как это более быстрый и младший брат.
  2. Используйте BufferedReader#readLine(), чтобы читать его построчно, вместо того, чтобы читать его символ за символом.

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);
9 голосов
/ 17 мая 2010

Использовать JSON Simple,

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

Имеет небольшой отпечаток, никаких зависимостей, поэтому идеально подходит для Android.

Вы можете сделать что-то вроде этого,

Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
5 голосов
/ 18 ноября 2013

Вы можете использовать библиотеку 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, который извлекается с сервера

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

вот мой класс

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

см. это

2 голосов
/ 17 мая 2010

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

0 голосов
/ 19 июля 2013

Для 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
0 голосов
/ 22 апреля 2013

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

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 из библиотеки ввода-вывода commons.

0 голосов
/ 28 декабря 2011

Нет необходимости выполнять цикл считывания самостоятельно. В JsonTokener это встроено. Например:

ttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new    
JSONTokener tokener = new JSONTokener(reader);
JSONArray finalResult = new JSONArray(tokener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...