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;