2012-06-19 75 views
0

我正在创建一个Android应用程序,该应用程序应该将Json从文件或网址解析为jsonarray和jsonobjects。 问题是,我的JSON是3.3 MB,当我使用一个简单的代码,如下所示:(现在不能访问我的真实代码,因为我在工作,从教程中复制了一些代码;所以它可能会有一些错误)Android:解析大型JSON文件

(假设我已经有我的InputStream内容)

InputStream content = entity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        builder.append(line); 
String twitterfeed = builder.toString(); 
} 

JSONArray jsonArray = new JSONArray(twittefeed); 
      Log.i(ParseJSON.class.getName(), 
        "Number of entries " + jsonArray.length()); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       Log.i(ParseJSON.class.getName(), jsonObject.getString("text")); 

运行我的Android设备上的代码,我解析字符串到jsonArray时得到一个内存不足错误。 我记录了一些事情,我发现我的总字符串是17 MB(的3.3 MB的JSON文件?!)当我使用一个小的JSON文件,如twitterfeed左右,代码工作正常。 当我在记忆中得到这个17 MB的字符串时,我无法解析JSON,因为那时我的内存不足。

经过大量研究,我发现杰克逊可能是我的解决方案,因为我明白可以解析输入流。这应该有所帮助,因为我的记忆中不需要17 MB的字符串;这不是我认为的最有效的方式....但我无法清楚地知道这真的会起作用,并没有让它自己运行。 有谁知道这是真的会工作,并在哪里我可以找到一个教程?

我发现"createJsonParser -- public JsonParser createJsonParser(InputStream in)"并认为这是我的方式去...但我不知道如何在我的代码中实现这一点,并找不到示例。有谁知道这是如何工作的?

+0

试试看这里:http://stackoverflow.com/questions/9390368/java-best-approach-to-parse-huge-extra-large-json-file –

回答

0

hybrid streaming approach与杰克逊是一个好的选择。这样,您可以通过原始JSON输入提前指示一个指针(随时对其进行验证),并且当您检测到需要处理的输入块时,可以将其读入树形层次结构中,以便您可以将任何你想要的数据。