2014-02-04 3 views
0

Я работаю над проектом Android, и у меня есть ответ json на синтаксический анализ.Android - анализ потока ввода с использованием gson

{"key1":"val1","key2":"val2","key3":[{...}, {...}, {...}... upto 5000 elements]} 

Вот как выглядит мой текущий json.

Я использую HttpUrlConnection для анализа ответа как потока.

Я также использую gson для анализа этого ответа с использованием пользовательских десериализаторов.

Все работает нормально, но проблема заключается в том, что одна куча начинает расти для этих 5000 объектов.

Я ищу способ, которым я могу брать объекты индивидуально и хранить их в локальном db.

Любые предложения?

ответ

1

Если у вас проблемы с памятью, это означает, что вы пытаетесь десериализовать весь поток сразу в памяти.

Gson предоставляет JsonStreamParser, но, к сожалению, это плохо подходит для вашего случая использования - у вас есть только один объект во входном потоке. Вызов .next() будет читать весь объект, включая этот массив.

Jackson, с другой стороны, имеет более мелкозернистую поточную поддержку через свой класс JsonParser. Вы можете прочитать каждое поле из потока, используя токенизацию:

MappingJsonFactory jfactory = new MappingJsonFactory(); 
JsonParser jParser = jfactory.createJsonParser(inputStream); 

while (jParser.nextToken() != JsonToken.END_OBJECT) 
{ 
    String fieldName = jParser.getCurrentName(); 

    if ("key3".equals(fieldname)) 
    { 
     jParser.nextToken(); // current token is "[", move next 

     // key3 is array, loop until token equal to "]" 
     while (jParser.nextToken() != JsonToken.END_ARRAY) 
     { 
      MyClass mc = jParser.readValueAs(MyClass.class); 
      // store in your DB 
     } 
    } 
} 
jParser.close() 

Обратите внимание, что вышеуказанное полностью не проверено; это просто показать концепцию. Он должен указать вам в правильном направлении.

+0

Привет, Брайан, я попробовал gson для отдельного синтаксического анализа поля на потоке ввода с помощью JsonReader и с использованием методов beginObject(), beginArray(), доступных в gson lib. Я обнаружил, что куча не увеличивается по границам, но время для разбора одного такого потока огромно. Поэтому, рассматривая этот сценарий для приложения для Android, я также не могу скомпрометировать циклы процессора. Должен быть найден некоторый средний путь, который может потребовать от моей команды API предоставить меньше объектов в ответ и написать собственный десериализатор gson для объектов массива. –

Смежные вопросы