【问题标题】:Should I parse JSON once and store the data in an ArrayList for future use OR parse it every time I need the data?我应该解析一次 JSON 并将数据存储在 ArrayList 中以供将来使用还是在每次需要数据时解析它?
【发布时间】:2021-03-04 14:47:25
【问题描述】:

我有一个包含 JSON 对象的 JSON 数组。每个 JSON 对象只有一个简单的 key/value 对(没有嵌套数组或类似的东西)。例如:

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

这些 JSON 对象中的值稍后将由应用程序使用。
根据我有限的经验,有两种简单的方法可以做到这一点:

  1. 在应用启动时解析 JSON ONCE,并将所有对象存储在 POJO 的 ArrayList(或任何 List 甚至 Map)中。
    我担心使用这种方法是内存使用和相对较长的等待时间。例如,如果 JSON 数组包含数百甚至数千个 JSON 对象,这意味着应用程序必须分配数百/数千个 POJO 的内存,我不知道我可以准确计算出多少或如何计算。理想情况下,HashMapArrayMap 可能更适合获取/访问值,但我读到Map 比简单的List 更占用内存。
  2. 仅在需要数据时解析 JSON。
    我对这种方法的担心可能是性能。我说“也许”是因为我不知道解析 JSON 文件/字符串到底有多麻烦。如果每次应用程序请求时我都必须解析 JSON,那么我基本上必须循环遍历 JSON 数组,获取 JSON 对象,并检查匹配的 id,以获取 value

性能和内存效率方面,哪一个更好
有没有比两者都更好的替代方案?

【问题讨论】:

    标签: java android json performance


    【解决方案1】:

    通过将整个 JSON 文件加载到内存中来处理它可能会很痛苦,并且可能会使许多内存受限的设备崩溃。但是,使用 Jackson JSON 解析库 (https://github.com/FasterXML/jackson),您可以将 http-request 作为 Reader 流式传输到 Jacksons Streaming API,这将允许您在每个 JSON 对象从管道中下来时立即对其进行处理。这使您可以在数据通过管道时对其进行处理,而不是加载整个 JSON 文件。

    我使用 Jackson 的 ObjectMapper 将 JSON 反序列化为 POJO。这使我可以在整个应用程序中使用域对象,因此,我不必担心到处解析 JSON 对象(或者如果您将数据移动到设备上的本地数据库中的游标)。如果您要将整个 JSON 文件加载到对象映射器中,您将创建一个巨大的对象图,它可能会使您的内存超出可用范围,并且您可能会收到 OutOfMemoryException。最终目标是在每个 JSON 对象下降时对其进行处理,但也可以使用 POJO 来执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2015-07-16
      • 2021-06-30
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多