如何处理巨大的JSON数组?

时间:2019-01-18 06:38:02

标签: android json string rest

当我从android应用程序调用rest api时,它将以JSON数组的形式发送响应,其中包含5000多个对象。在使用for循环读取和解析响应实体时,它花费了太多时间并且变得无响应。

JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));

这是JSON的示例:

[["aa@gmail.com",true],["bb@gmail.com",true],["cc@gmail.com",true],["dd@gmail.com",true],["ee@gmail.com",true],["ff@gmail.com",true],["gg@gmail.com",true],["hh@gmail.com",true]]

请帮助我。

3 个答案:

答案 0 :(得分:1)

您可以使用后台线程(通过AsynTask可以轻松完成),并在doInBackground中编写昂贵的代码

private static class BackgroundTask extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... params) {
    JSONArray list = new JSONArray(EntityUtils.toString(response.getEntity()));
}

@Override
protected void onPostExecute(String html) {
}
}

还尝试使用其他内容解析json,例如,对于某些类型的数据,gson的速度要快得多。

Feed feed = getGson().fromJson(json, Feed.class);

无论如何,一次返回5000个对象不是一个好习惯,应该改进您的API以处理分页并根据您的需求从每个请求返回10至100个项目。

答案 1 :(得分:0)

首先,您应该在后台线程中执行所有这些任务,并且在可能的情况下使用HashMap<Key,Value>进行解析时,它具有类似hashmap.get("key")的方法,这些方法无需使用for循环即可获取值,也可以使用arraylist还可从中获取值而无需使用for循环。

答案 2 :(得分:0)

解决此问题的最简单,最常用的方法是使用pagination。简而言之-您首先请求50或100个对象并显示它们,然后显示下一个,依此类推。概念是最终用户通常不需要一次全部使用5000个对象,因此可以在需要时接收它们。

如果出于某些业务/逻辑原因,您需要一次处理所有5000个对象,则可以考虑使用另一种通信格式,例如protobufXML with SAX parser

在以上两种情况下,您都需要调整用于与客户端一起提供数据的rest api。如果您无法控制后端,则可以尝试使用Android Profiler来准确检查解析的最慢部分,并在客户端(android)上对其进行优化。