Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
AlexxeiS
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 5
#1

Парсинг большого объема JSON данных - Android

16.06.2013, 13:51. Просмотров 1521. Ответов 3
Метки нет (Все метки)

Столкнулся со следующей проблемой. С сервера приходит большой объем JSON данных (несколько мб), и когда я пытаюсь преобразовать полученные данные в String для того, чтобы вызвать конструктор JSONArray (String json), то получаю ошибку "Out of memory".

Преобразовываю так:
Java
1
2
HttpResponse response = httpclient.execute(httppost);
return EntityUtils.toString(response.getEntity(),"UTF-8");
Почитав информацию в интернете я нашел несколько вариантов решения, но хотел бы узнать какой из них наиболее оптимален с точки зрения производительности/стабильности и какой используете вы?

Решения:
1) JSONReader (поддерживается c API 11, мне не подходит)
2) Jackson Java JSON-processor (насколько я понял, это сторонняя библиотека)
3) Как-то обойтись без преобразования InputStream в String, но как если конструктор требует именно String?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 13:51     Парсинг большого объема JSON данных
Посмотрите здесь:

Android Парсинг JSON'а
Android Парсинг json, многомерный массив с разными типами данных
Android Парсинг JSON-файла
Json http парсинг. Массивы Android
Парсинг JSON ответа от сервера Android
Парсинг JSON-строки и вывод данных из строки Android
Android Парсинг json
Android Парсинг JSON
Android Подготовить класс для большого JSON
Парсинг JSON объекта Android
Android Парсинг большого xml
Парсинг Json Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.06.2013, 14:43     Парсинг большого объема JSON данных #2
он нескольких мегабайт ничего не упадет, ищите другие утечки памяти.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
23.01.2015, 17:32     Парсинг большого объема JSON данных #3
AlexxeiS, молодец, провёл мини-исследование.
V0v1k, автор прав, падения при скачивании и раскрытии JSON в несколько мегабайт при помощи стандартной библиотеки org.json случаются на некоторых устройствах.
А вот и статья об этом: http://habrahabr.ru/post/200898/
Я тоже провёл исследование и пока что понял, что надо читать JSON-данные потоком. Для этого годятся три библиотеки: JsonReader (>= API 11, что уже нормально), GSON (насколько я понял, теперь это и есть JsonReader), Jackson. Во втором и третьем случае придётся ставить jar'ики.
Статей много, вот некоторые из них:
http://pivotallabs.com/parsing-json-...id-jsonreader/ - здесь автор натупил с BufferReader,
https://kahdev.wordpress.com/2012/03...th-jsonreader/
http://www.mkyong.com/java/gson-stre...nd-write-json/
Проблема актуальная. Чтение JSON по типу DOM (целиком дерево) малость устарело и неэффективно, но проще в программировании.

Добавлено через 1 час 51 минуту
Понял, что для небольших файлов (несколько сотен килобайт) выгоднее использовать обычный org.json, поскольку работа с ним там тривиальна.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
27.01.2015, 18:10     Парсинг большого объема JSON данных #4
Первоначально я предполагал, что переполнение памяти даёт обработка всего дерева JSON при помощи библиотеки org.json. Оказалось, что переполнение происходит при скачивании файла в следующих строчках:
Java
1
2
3
4
5
String line;
sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
    sb.append(line);
}
И, конечно же, подавляющее большинство авторов в своих примерах скачивают файлы именно так. Возможно, что если бы и хватило памяти на чтение всех строк сразу, переполнения при распознавании JSON не возникло бы, но я решил доделать до конца.
Поэтому использовал класс BufferedReader при работе с потоками и подключил JsonReader. Работа с ним архисложна в моральном плане, т.к. любое неудачное действие приводит к крэшу программы. Встретили null там, где не ожидали - увидели Exception, встретили объект вместо массива - снова. Не распозналось число, опять туда же.
В итоге получилось, что для малых файлов ускорение незаметно, а вот для больших ускорение есть. И не возникает переполнений памяти.
Если кто-то сталкивался, и будет интересно, могу написать код.
Yandex
Объявления
27.01.2015, 18:10     Парсинг большого объема JSON данных
Ответ Создать тему
Опции темы

Текущее время: 18:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru