2012-06-19 3 views
0

Я создаю приложение для Android, которое должно анализировать Json из файла или URL-адреса jsonarray и jsonobjects. Проблема в том, что мой json равен 3,3 мб, и когда я использую простой код, что-то вроде этого: (теперь я не могу получить доступ к реальному коду, потому что im на работе, скопировал какой-то код из учебника, так что в нем могут быть некоторые ошибки)Android: Разбор большого файла JSON

(предполагая, что у меня уже есть мое содержание InputStream)

InputStream content = entity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        builder.append(line); 
String twitterfeed = builder.toString(); 
} 

JSONArray jsonArray = new JSONArray(twittefeed); 
      Log.i(ParseJSON.class.getName(), 
        "Number of entries " + jsonArray.length()); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       Log.i(ParseJSON.class.getName(), jsonObject.getString("text")); 

когда я запускаю этот код на моем устройстве Android, я получаю OutOfMemory ошибки при разборе строки в jsonArray. Я зарегистрировал некоторые вещи, которые обнаружили, что моя общая строка составляет 17 мб (из файла json размером 3,3 МБ ?!) Когда я использую небольшой файл json, например, twitterfeed или так, код работает нормально. Когда я получил эту 17-мегабайтную строку в своей памяти, я не могу разобрать json, потому что тогда у меня закончилась нехватка памяти.

После многих исследований я обнаружил, что Джексон может быть моим решением, потому что я понял, что можно разобрать входной поток. Это должно помочь, потому что мне не нужна строка 17 мб в моей памяти; и это не самый эффективный способ, который я считаю ... Но я не могу понять, что это действительно сработает, и не заставляло его работать. Кто-нибудь знает об этом, действительно будет работать, и где я могу найти учебник?

Я нашел "createJsonParser -- public JsonParser createJsonParser(InputStream in)" и думаю, что это мой путь ... но я не знаю, как реализовать это в своем коде и не могу найти пример. Кто-нибудь знает, как это работает?

+0

Попробуйте найти здесь: http://stackoverflow.com/questions/9390368/java-best-approach-to-parse-huge-extra-large-json-file –

ответ

7

Вы должны использовать потоковое воспроизведение json с помощью gson или jackson. С Jackson вы также можете использовать гибридный подход. Это значительно снизит потребление памяти, поскольку в память загружается только часть обработанного json.

https://sites.google.com/site/gson/gson-user-guide http://jackson.codehaus.org/

Джексон пример http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/

0

hybrid streaming approach с Джексоном является хорошим вариантом. Таким образом, вы можете продвигать указатель через свой исходный вход JSON (проверяя его, как вы идете), и, когда вы обнаруживаете входной блок, который нужно обработать, вы можете прочитать его в иерархию дерева, чтобы вы могли вытащить любые данных, которые вы хотите от него.