【问题标题】:Parsing a large json in android of 11 MB [closed]在 11 MB 的 android 中解析大型 json [关闭]
【发布时间】:2013-01-19 08:50:30
【问题描述】:

我在使用 GSON 和 Jackson 在 android 中解析大约 11MB 的大型 JSON 时遇到问题。问题是发生内存不足错误异常并且堆大小不足以完成此过程。 这是我的纸模型课

public class Paper {

public int primaryKey;

public String title;

public int entry;

public Boolean favourite;

public String comment;

public int opt;

public int score;
}

这是我的响应模型类

public class Response {

public List<Paper> papers;

} 

这是我的 JSON 字符串

{"Paper":[[{"abstract":"Not Available","title":"A Fully Intraocular 0.0169mm<sup>2<\/sup>/pixel 512-Channel Self-Calibrating Epiretinal Prosthesis in 65nm CMOS","primaryKey":3,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A Scalable 2.9mW 1Mb/s eTextiles Body Area Network Transceiver with Remotely Powered Sensors and Bi-Directional Data Communication","primaryKey":14,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 0.18µm CMOS SoC for a 100m-Range 10fps 200×96-Pixel Time-of-Flight Depth Sensor","primaryKey":20,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 12b 1.6GS/s 40mW DAC in 40nm CMOS with >70dB SFDR over Entire Nyquist Bandwidth","primaryKey":26,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"All-Digital Hybrid Temperature Sensor Network for Dense Thermal Monitoring","primaryKey":49,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"32Gb/s Data-Interpolator Receiver with 2-Tap DFE in 28nm CMOS","primaryKey":51,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 93% Efficiency Reconfigurable Switched-Capacitor DC-DC Converter Using On-Chip Ferroelectric Capacitors","primaryKey":60,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1},{"abstract":"Not Available","title":"A 45nm CMOS Near-Field Communication Radio with 0.15A/m RX Sensitivity and 4mA Current Consumption in Card Emulation Mode","primaryKey":61,"entry":9,"score":-1,"comment":null,"favourite":false,"opt":1}]]}

我不知道我在哪里做错了。我的论文数为空。

【问题讨论】:

标签: android json parsing jackson gson


【解决方案1】:

在读取完整输入之前,使用流式解析器并尝试在读取内容时对其进行处理。这样您就可以避免将完整的结构保存在内存中。

例如,如果您的输入 JSON 是一个巨大的数组,您可以逐个元素地处理输入。

【讨论】:

  • 它充满了不同的对象,所以我不能将它传递给单个类。 JSON URL 编码非常庞大,可以容纳。请通过上面的链接,为任何一个特定的课程提供一些想法。
  • 看看 Gson 流式文档,它解释了如何混合流式和数据绑定:sites.google.com/site/gson/streaming
【解决方案2】:

您也可以尝试使用Genson,检查数据绑定api (new Genson().deserialize(json, ToClass.class)) 或直接使用流式api。

这取决于你想做什么。 如果您需要内存中的所有数据,那么没有太多选择,您需要增加它。 如果您可以在阅读时处理内容并且不需要始终在内存中使用它,那么它可以与流式 api 一起正常工作(非常高效并且使用极少的内存)。

编辑 解决方案

  1. 您想使用数据绑定以减少工作量。首先看一下这个项目https://github.com/joelittlejohn/jsonschema2pojo,它允许您基于 json 示例生成 java bean 类。当您生成的类时,只需执行 new Genson().deserialize(json, MyGeneratedClass.class); 如果您正在执行多个 ser/deser,您应该重用 Genson 实例以获得更好的性能。

  2. 如果您不想使用 1),如果结构在运行时发生更改(这将阻止生成类),或者您仍然有内存问题,请使用 Gensons streaming api。 它高效、高效且易于使用。

【讨论】:

  • 它充满了不同的对象,所以我不能将它传递给单个类。 JSON URL 编码非常庞大,可以容纳。请通过上面的链接,为任何一个特定的课程提供一些想法。
  • @Praveen 我已经用更多细节更新了我的答案。如果还不够,我会尝试为您提供一些示例,但如果您发布代码会有所帮助。
  • 我可以使用你在 java 中讲述的内容。但在android中是不可能的。因为 android 的堆大小很大。
  • @Praveen 您的意思是您尝试了解决方案 1 并在计算机上工作?如果 1 在 android 上不起作用,则唯一剩下的解决方案是 2。试试吧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多