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

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

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

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

16.06.2013, 13:51. Просмотров 1610. Ответов 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?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 13:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Парсинг большого объема JSON данных (Программирование Android):

Парсинг json, многомерный массив с разными типами данных - Программирование Android
Сервер отдает массив вида: $arr $arr Если делать так: JSONObject jObj = new JSONObject(outOfServer); jObj.getJSONObject(0); То...

Логирование большого объема затирает первые строки лога - Программирование Android
Вечер добрый, вопрос касательно Android Studio и логирование в этой среде. Есть сферическое приложение в вакууме которое выводит в лог...

Парсинг JSON-строки и вывод данных из строки - Программирование Android
Добрый день! Я разрабатываю Android-клиент, который мог бы обмениваться данными с размещенной WCf-службой. Для чтения данных из службы...

Парсинг большого xml - Программирование Android
Если есть большой JSON его можно парсить при помощи библиотеки gson, а если есть большой xml как этот https://lenta.ru/rss. Чем его лучше...

Подготовить класс для большого JSON - Программирование Android
Помогите составить класс для JSONа по ссылке http://mobile165.hr.phobos.work/list(ну чтобы этот JSON можно было поместить в этот класс при...

Парсинг Json - Программирование Android
Здравствуйте подcкажите как сделать: нужно данные из Json засунуть в массив, чтобы его дальше передавать по активностям. Json парсится в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.06.2013, 14:43 #2
он нескольких мегабайт ничего не упадет, ищите другие утечки памяти.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
23.01.2015, 17:32 #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, поскольку работа с ним там тривиальна.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
27.01.2015, 18:10 #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, встретили объект вместо массива - снова. Не распозналось число, опять туда же.
В итоге получилось, что для малых файлов ускорение незаметно, а вот для больших ускорение есть. И не возникает переполнений памяти.
Если кто-то сталкивался, и будет интересно, могу написать код.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2015, 18:10
Привет! Вот еще темы с ответами:

Парсинг json - Программирование Android
Здравствуйте! Имеется такой json код: { "data": }И я его обрабатываю так: JSONArray urls = json.getJSONArray("data"); Тогда, как мне...

Парсинг JSON - Программирование Android
Доброй ночи! Есть задача распарсить JSON не зная изначально сколько и чего там находится, а так же не зная ни имен ни другой инфы, кроме...

Парсинг JSON - Программирование Android
Дали задание Мне надо воссоздать структуру JSON в сообственных объектах. Т.е. парсить надо не в String (например), а сделать вот что: -...

Парсинг JSON - Программирование Android
Привет знатокам своего дела, у меня уже крик души! Какой час не выходит распарсить такой JSON ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.01.2015, 18:10
Ответ Создать тему
Опции темы

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