Java 使用gson从对象列表获取JSON字符串
以前我的代码是这样的:Java 使用gson从对象列表获取JSON字符串,java,json,rest,gson,Java,Json,Rest,Gson,以前我的代码是这样的: objJson = gson.toJson(objList); return objJson; 我得到了带有该返回值的字符串JSON 但是,当JSON变得太大时,我开始出现内存不足错误 然后,我按照下面的帖子将对象列表高效地转换为JSON字符串,这样就不会再有OOM错误了: 因此,我在这里遵循了上述方法: public String writeJsonStream(List<MyObj> objList) throws IOException {
objJson = gson.toJson(objList);
return objJson;
我得到了带有该返回值的字符串JSON
但是,当JSON变得太大时,我开始出现内存不足错误
然后,我按照下面的帖子将对象列表高效地转换为JSON字符串,这样就不会再有OOM错误了:
因此,我在这里遵循了上述方法:
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;
}
公共字符串writeJsonStream(列表对象列表)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
OutputStreamWriter OutputStreamWriter=新的OutputStreamWriter(BAS,“UTF-8”);
JsonWriter writer=新的JsonWriter(outputStreamWriter);
writer.setIndent(“”);
writer.beginArray();
Gson Gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
for(MyObj MyObj:objList){
toJson(myobj,myobj.class,writer);
}
字符串objJson=writer.toString();
writer.endArray();
writer.close();
返回objJson;
}
但是这个返回的对象com.google.gson.stream。JsonWriter@6a9454cd
方法
gson.toJson(myobj,myobj.class,writer)
的类型为void,不返回JSON字符串。那么,在这种情况下,如何获取JSON字符串呢?很遗憾,将流转换为静态对象并不能避免OOM问题。无论采用哪种方式,您都试图分配/请求内存来构造/写入该字符串。您必须通过管道将结果流传输到另一个流,或者通过在某个循环中使用BufferedWriter
或其他方式简单地使用该流中的所有数据。很遗憾,将流转换为静态对象并不能避免OOM问题。无论采用哪种方式,您都试图分配/请求内存来构造/写入该字符串。您必须通过管道将结果流传输到另一个流,或者通过在某个循环中使用BufferedWriter
或其他方式使用该流中的所有数据。这是因为您从String objJson=writer.toString()获取JSON字符串代码>。这不是您应该如何检索它:这段代码将只调用writer
实例上的toString()
方法。因为对于这个对象,结果是默认的com.google.gson.stream。JsonWriter@6a9454cd
相反,您要做的是获取JsonWriter
写入输出流的字节。在本例中,您使用的是,因此可以调用以字符串形式获取内容:
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");
}
这是因为您从String objJson=writer.toString()获取JSON字符串代码>。这不是您应该如何检索它:这段代码将只调用writer
实例上的toString()
方法。因为对于这个对象,结果是默认的com.google.gson.stream。JsonWriter@6a9454cd
相反,您要做的是获取JsonWriter
写入输出流的字节。在本例中,您使用的是,因此可以调用以字符串形式获取内容:
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");
}
试试这个。将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;
公共字符串writeJsonStream(列表对象列表)引发IOException{
OutputStream baos=系统输出;
OutputStreamWriter OutputStreamWriter=新的OutputStreamWriter(BAS,“UTF-8”);
JsonWriter writer=新的JsonWriter(outputStreamWriter);
writer.setIndent(“”);
writer.beginArray();
Gson Gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
for(MyObj MyObj:objList){
toJson(myobj,myobj.class,writer);
}
字符串objJson=writer.toString();
writer.endArray();
writer.close();
返回objJson;
尝试此操作。将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;
公共字符串writeJsonStream(列表对象列表)引发IOException{
OutputStream baos=系统输出;
OutputStreamWriter OutputStreamWriter=新的OutputStreamWriter(BAS,“UTF-8”);
JsonWriter writer=新的JsonWriter(outputStreamWriter);
writer.setIndent(“”);
writer.beginArray();
Gson Gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
for(MyObj MyObj:objList){
toJson(myobj,myobj.class,writer);
}
字符串objJson=writer.toString();
writer.endArray();
writer.close();
返回objJson;