2012-08-29 74 views
5

我的資產文件夾中存儲了大約1MB的JSON文件,每次運行時都需要在我的應用中加載。我發現內置的JSON解析器(org.json)非常緩慢地解析文件,但是一旦它被解析,我就可以非常快速地訪問和操作數據。從點擊應用程序到Activity1被啓動的那一刻,我已經計算出多達7或8秒的時間,但從Activity1到Activity2只需要幾個毫秒,這取決於從加載的數據處理的數據活動1。在Android上解析〜1 MB JSON很慢

我把文件讀入內存,並解析它使用:

String jsonString = readFileToMemory(myFilename) 
JSONArray array = new JSONArray(jsonString); 

其中readFileToMemory(字符串)看起來是這樣的:

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(); 
} 

沒有人有我如何能加快任何建議最初加載和解析數據?我應該掩飾加載屏幕後面的整個過程嗎?

+0

有微的優化可以使,像'data.ensureCapacity(stream.available())'並且使你的塊8K或64K等等,但真正的更好的是串行化數據或保存它到解析後的SQL表中,然後使用該表,除非檢測到JSON文件已更新。 –

回答

2

您應該創建一個SQLite表來存儲數據,並在第一次運行應用程序時將其從JSON移動到SQL。作爲一個額外的好處,這使數據更容易搜索,並使您可以修改應用程序內的數據。

+0

是的,嘗試SQLite或將您的JSON拆分爲小的。 – neohope

8

JSONObject - 來自json.org的,是用來解析JSON的最簡單的API。但它具有成本效益。我已經對JSONObject,Gson和Jackson做了大量的實驗。看起來不管你做什麼,JSONObject(因此JSONArray)將是最慢的。請切換到Jackson或Gson。

下面是兩個

(最快)Jackson > Gson >> JSONObject(最慢)

的相對性能參見:
- Jackson
- Gson

+0

傑克遜可以使用沒有POJO? LIKE截至目前,我正在使用JSONObject,逐個閱讀我的json文件,並使db插入 - (沒有類)。我可以使用傑克遜同樣的方式逐一閱讀json對象/數組並解析,使數據庫插入? –

+0

是的。請閱讀這裏的文檔。 http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

Jackson鏈接被破壞 – VVB