Должен ли я анализировать JSON один раз и сохранять данные в ArrayList для будущего использования ИЛИ анализировать его каждый раз, когда мне нужны данные?

#java #android #json #performance

#java #Android #json #Производительность

Вопрос:

У меня есть массив JSON, который содержит объекты JSON. Каждый объект JSON имеет только простой key / value pairs (без вложенного массива или чего-то подобного). Например:

 [
  {
    "id": "01",
    "name": "Zero One",
    "desc": "Something about Zero One"
    ...
  },
  ...
]
 

Значения в этих объектах JSON будут использоваться приложением позже.
Исходя из моего ограниченного опыта, есть два простых способа добиться этого:

  1. Проанализируйте JSON ОДИН РАЗ при запуске приложения и сохраните ВСЕ объекты в ArrayList (или любом List или даже a Map ) POJOs.
    Я беспокоюсь об использовании этого метода из-за использования памяти и относительно длительного времени ожидания. Например, если массив JSON содержит сотни или даже тысячи объектов JSON, это означает, что приложение должно выделить сотни / тысячи единиц памяти, и я не знаю, сколько или как я могу точно это рассчитать. В идеале, HashMap или ArrayMap , вероятно, лучше для получения / доступа к значению, но я читал, что Map это еще больше забивает память, чем простое List .
  2. Анализируйте JSON только тогда, когда данные необходимы.
    Мое беспокойство по поводу этого метода, возможно, связано с производительностью. Я сказал «может быть», потому что я не знаю точно, насколько сложен синтаксический анализ файла / строки JSON. Если мне нужно анализировать JSON каждый раз, когда приложение запрашивает его, то мне, по сути, нужно выполнить цикл по массиву JSON, получить объект JSON и проверить соответствие id , чтобы получить value .

Какой из них лучше с точки зрения производительности И эффективности использования памяти?
Есть ли альтернатива, которая даже лучше, чем обе?

Ответ №1:

Обработка всего файла JSON путем загрузки его в память может быть болезненной и может привести к сбою большого количества устройств с ограниченной памятью. Однако, используя библиотеку синтаксического анализа JSON Джексона (https://github.com/FasterXML/jackson ) вы можете передавать http-запрос в качестве средства чтения в потоковый API Jacksons, который позволит вам обрабатывать каждый объект JSON, как только он выходит из канала. Это позволяет обрабатывать данные по мере их поступления по каналу вместо загрузки всего файла JSON.

Я использую ObjectMapper из Jackson для десериализации JSON в POJO. Это позволяет мне работать с объектами домена во всем моем приложении, поэтому мне не нужно беспокоиться о разборе объектов JSON повсюду (или курсоров, если вы перемещаете данные в базу данных локально на устройстве). Если бы вы загружали весь файл JSON в object mapper, вы бы создали огромный объектный граф, который может вывести вашу память за пределы того, что доступно, и вы могли бы получить исключение OutOfMemoryException. Конечная цель — обрабатывать КАЖДЫЙ из объектов JSON по мере их поступления, но также имеет преимущество использования POJO для этого.