在 Android 上解析 ~1 MB JSON 非常慢
Posted
技术标签:
【中文标题】在 Android 上解析 ~1 MB JSON 非常慢【英文标题】:Parse ~1 MB JSON on Android very slow 【发布时间】:2012-08-29 03:40:39 【问题描述】:我的资产文件夹中存储了一个大约 1MB 的 JSON 文件,每次运行时我都需要将其加载到我的应用程序中。我发现内置的 JSON 解析器 (org.json) 解析文件的速度非常慢,但是一旦解析完成,我就可以非常快速地访问和操作数据。从我点击应用程序到启动 Activity1 的那一刻,我计算了多达 7 或 8 秒,但从 Activity1 到 Activity2 只需几毫秒,这取决于从加载的数据处理的数据活动1。
我正在将文件读入内存并使用以下方法对其进行解析:
String jsonString = readFileToMemory(myFilename)
JSONArray array = new JSONArray(jsonString);
readFileToMemory(String) 如下所示:
private String readFileToMemory(String filename)
StringBuilder data = new StringBuilder();
BufferedReader reader = null;
try
InputStream stream = myContext.getAssets().open(filename);
reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
int result = 0;
do
char[] chunk = new char[512];
result = reader.read(chunk);
data.append(chunk);
while(result != -1);
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
return data.toString();
是否有人对如何加快数据的初始加载和解析有任何建议?我是否应该将整个过程隐藏在加载屏幕后面?
【问题讨论】:
您可以进行一些微优化,例如data.ensureCapacity(stream.available())
并将您的块设置为 8K 或 64K 等,但实际上更好的是序列化您的数据或将其保存到 SQL 表解析后,然后使用它,除非您检测到 JSON 文件已更新。
【参考方案1】:
JSONObject
——来自 json.org 的那个,是用于解析 JSON 的最简单的 API。然而,它带来了成本——性能。我对 JSONObject、Gson 和 Jackson 进行了广泛的实验。似乎无论您做什么,JSONObject(以及 JSONArray)都将是最慢的。请切换到 Jackson 或 Gson。
这是两者的相对表现
(最快)Jackson > Gson >> JSONObject
(最慢)
参考: - Jackson - Gson
【讨论】:
可以在没有 POJO 的情况下使用 Jackson 吗?就像现在我正在使用 JSONObject,从我的 json 文件中一一读取,并进行 db 插入 - (无类)。我可以使用 Jackson 相同的方式来一一读取 json 对象/数组并解析,进行 db 插入吗? 是的。请阅读此处的文档。 fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/… 杰克逊链接已损坏【参考方案2】:您应该创建一个 SQLite 表来存储数据,并在应用程序第一次运行时将其从 JSON 移动到 SQL。作为一个额外的好处,这使数据更易于搜索,并使您可以在应用程序内修改数据。
【讨论】:
是的,试试 SQLite 或者把你的 JSON 拆分成小的。 @mimicocotopus 你能帮帮我吗?形成领域数据库? ***.com/questions/70620062/…以上是关于在 Android 上解析 ~1 MB JSON 非常慢的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android studio 上使用 klaxon 从 thingspeak 解析 json 以获取字段值?