2015-11-04 73 views
0

以前我的代碼對象列表JSON字符串只是這樣的:獲取使用GSON

objJson = gson.toJson(objList); 
return objJson; 

而且我得到了JSON字符串與返回值。

但是後來我開始着名內存不足錯誤當JSON變得太大。

然後我也跟着下面的帖子,其將在OOM錯誤的有效方式對象爲JSON字符串列表中會有更多:

https://sites.google.com/site/gson/streaming

所以,我在這裏遵循上述辦法:

public String writeJsonStream(List<MyObj> objList) throws IOException { 
    ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
    OutputStreamWriter outputStreamWriter=new OutputStreamWriter(baos,"UTF-8"); 
    JsonWriter writer = new JsonWriter(outputStreamWriter); 
    writer.setIndent(" "); 
    writer.beginArray(); 
    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create(); 
    for (MyObj myobj : objList) { 
     gson.toJson(myobj, MyObj.class, writer); 
    } 

    String objJson = writer.toString(); 
    writer.endArray(); 
    writer.close(); 
    return objJson; 
} 

但是這個返回對象[email protected]

方法gson.toJson(myobj, MyObj.class, writer);是void類型,不返回JSON字符串。那麼如何在這種情況下獲取JSON字符串?

回答

3

這是因爲您從String objJson = writer.toString();獲取JSON字符串。這不是你應該如何檢索它的代碼:這段代碼只會調用writer實例上的toString()方法。由於此對象的toString() is not overriden,結果爲默認[email protected]

您想要做的是獲取JsonWriter寫入輸出流的字節。在你的情況,您使用的是ByteArrayOutputStream所以你可以調用toString(charsetName)獲取內容爲一個字符串:

public String writeJsonStream(List<MyObj> objList) throws IOException { 
    ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
    OutputStreamWriter outputStreamWriter=new OutputStreamWriter(baos,"UTF-8"); 
    JsonWriter writer = new JsonWriter(outputStreamWriter); 
    writer.setIndent(" "); 
    writer.beginArray(); 
    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create(); 
    for (MyObj myobj : objList) { 
     gson.toJson(myobj, MyObj.class, writer); 
    } 
    writer.endArray(); 
    writer.close(); 
    return baos.toString("UTF-8"); 
} 

作爲一個側面說明,你可以只使用一個StringWriter,而不是與toString()獲取內容:

StringWriter stringWriter = new StringWriter(); 
JsonWriter writer = new JsonWriter(stringWriter); 
// rest of code 
writer.close(); 
String json = stringWriter.toString(); 
+0

感謝它的工作。另外,一個側面說明+1;;) –

0

好吧,將流轉換爲靜態對象不幸並不能避免OOM問題。無論哪種方式,您都試圖分配/請求內存來構造/寫入該字符串。您必須將產生的流傳輸到另一個流,或者通過在某個循環中使用BufferedWriter或其他方法簡單地使用該流中的所有數據。

0

試試這個。將ByteArrayOutputStream更改爲OutputStream並從System.out獲取對象

public String writeJsonStream(List<MyObj> objList) throws IOException { 
     OutputStream baos = System.out; 
     OutputStreamWriter outputStreamWriter=new OutputStreamWriter(baos,"UTF-8"); 
     JsonWriter writer = new JsonWriter(outputStreamWriter); 
     writer.setIndent(" "); 
     writer.beginArray(); 
     Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create(); 
     for (MyObj myobj : objList) { 
      gson.toJson(myobj, MyObj.class, writer); 
     } 

     String objJson = writer.toString(); 
     writer.endArray(); 
     writer.close(); 
     return objJson;