在 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 以获取字段值?

从 Android 上的 URL 简单解析 JSON 并显示在列表视图中

Android 解析JSON格式数据

如何反序列化大 JSON 文件 (~300Mb)

Android的JSON解析(上)

Unity上同时兼容Android和IOS的JSON库