Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
AlexxeiS
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 5
1

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

16.06.2013, 13:51. Просмотров 2072. Ответов 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, многомерный массив с разными типами данных
Сервер отдает массив вида: $arr $arr Если делать так: JSONObject jObj = new...

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

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

Парсинг большого xml
Если есть большой JSON его можно парсить при помощи библиотеки gson, а если...

Подготовить класс для большого JSON
Помогите составить класс для JSONа по ссылке...

3
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
16.06.2013, 14:43 2
он нескольких мегабайт ничего не упадет, ищите другие утечки памяти.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
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-streaming-to-read-and-write-json/
Проблема актуальная. Чтение JSON по типу DOM (целиком дерево) малость устарело и неэффективно, но проще в программировании.

Добавлено через 1 час 51 минуту
Понял, что для небольших файлов (несколько сотен килобайт) выгоднее использовать обычный org.json, поскольку работа с ним там тривиальна.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
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
Здравствуйте! Имеется такой json код: { "data": }И я его обрабатываю так:...

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

Парсинг JSON
Доброй ночи! Есть задача распарсить JSON не зная изначально сколько и чего там...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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