2015-11-04 88 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;