SanchelliosProg
@SanchelliosProg
Java, Android, Software Testing

Как парсить JSON большого размера?

Привет всем. Нужно распарсить немалый по размерам JSON.

Почитал вот это и реализовал в AsyncTask (пока что) следующее:

private class JSONLoader extends AsyncTask<String, Void, ArrayList<Artist>> {
        ArrayList<Artist> artistsCollection = new ArrayList<>();
        @Override
        protected ArrayList<Artist> doInBackground(String... params) {
            try{
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder().url(params[0]).build();
                Response response = client.newCall(request).execute();

                if(response.isSuccessful()){
                    InputStream in = response.body().byteStream();
                    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
                    reader.beginArray();
                    while (reader.hasNext()){
                        Artist artist = new Gson().fromJson(reader, Artist.class);
                        artistsCollection.add(artist);
                    }
                    reader.endArray();
                    reader.close();
                }else {
                    throw new IOException("Unexpected code" + response);
                }
                return artistsCollection;

            }catch (IOException e){
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(ArrayList<Artist> artists) {
            setArtists(artists);
        }
    }
}


В любом случае, приложение "вылетает", т.к. требуется очень-очень-очень много памяти. Пожалуйста, подскажите как с этим совладать.

PS: Могу предположить, что многие будут советовать Jackson. Вот тут, пожалуйста, если не трудно, пришлите побольше примеров кода. Я посмотрел несколько туториалов, и, честно говоря, в этой мешанине со вкусом карри не нашёл толковых руководств по перемещению данных в POJOбъекты.
  • Вопрос задан
  • 1684 просмотра
Решения вопроса 1
gadfi
@gadfi
https://gamega.org
235 КБ ..... я бы использовал gson не на столько большой размер чтобы заморачиваться, если есть свободное время ради интереса можете сравнить скорость gson и jacson на этом примере, не думаю что разница будет существенна(есть подозрение что gson покажет лучший результат)

В любом случае, приложение "вылетает", т.к. требуется очень-очень-очень много памяти. Пожалуйста, подскажите как с этим совладать.


не работал с JsonReader но возможно что то делаете не так, не такой уж большой размер, хотя можете сделать android:largeHeap="true"
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Sarrius
По мере роста данных, jackson имеет преимущество против gson. Выбирайте jackson
Ответ написан
@maratische
Я в похожей ситуации написал свой аналог SAX парсера,.
Не надо грузить весь текстовый файл огромного размера в память, вам все равно нужны какие то конкретные данные только, поэтому на выходе потока, который получает данные (например скачивает), мы вешаем обработчик. который построчно/побайтово обрабатывает входящие данные, вытаскивая из них только нужное.
И на выходе мы получаем только массив с нужными данными, не загружая все в память.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы