![](/img/trans.png)
[英]Android: Parsing JSON file with a large property with low memory usage
[英]Android: Parsing large JSON file
我正在創建一個Android應用程序,該應用程序應將Json從文件或url解析為jsonarray和jsonobjects。 問題是我的json為3.3 mb,當我使用簡單的代碼時,如下所示:(由於我在工作,因此從教程中復制了一些代碼,現在無法訪問我的真實代碼;因此其中可能有一些錯誤)
(假設我已經有我的輸入流內容)
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時出現OutOfMemory錯誤。 我記錄了一些東西,發現我的總字符串為17 mb(一個3.3 mb的json文件?!),當我使用一個小的json文件(例如twitterfeed左右)時,代碼可以正常工作。 當我的內存中有這個17 mb的字符串時,我無法解析json,因為那樣我會耗盡內存。
經過大量研究,我發現傑克遜可能是我的解決方案,因為我知道可以解析輸入流。 這應該有所幫助,因為比起我,我的內存中不需要17 mb的字符串; 但這不是我猜出的最有效的方法。...但是我無法弄清楚這確實可行,也沒有讓它自己運行。 有誰知道這確實可行,在哪里可以找到教程?
我找到了“ createJsonParser-public JsonParser createJsonParser(InputStream in)”,並認為這是我要走的路...但是我不知道如何在我的代碼中實現它,並且找不到示例。 有誰知道這是如何工作的?
您應該通過gson或jackson使用json流。 使用Jackson,您也可以使用混合方法。 這將大大減少您的內存消耗,因為僅將解析的json部分加載到內存中。
https://sites.google.com/site/gson/gson-user-guide http://jackson.codehaus.org/
傑克遜示例http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/
與Jackson的混合流式傳輸方法是一個不錯的選擇。 這樣,您可以通過原始JSON輸入前進一個指針(在運行時對其進行驗證),並且當您檢測到需要處理的輸入塊時,可以將其讀入樹形層次結構,以便可以提取任何您想要的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.