【问题标题】:Getting JSON string from object list using gson使用 gson 从对象列表中获取 JSON 字符串
【发布时间】:2015-11-04 13:22:22
【问题描述】:

以前我的代码是这样的:

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

我得到了带有该返回值的字符串 JSON。

但是当 JSON 变得太大时,我开始遇到著名的 Out Of Memory 错误

然后我按照以下帖子将对象列表转换为 JSON 字符串以一种有效的方式,OOM 错误将不再存在:

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;
}

但是这个返回对象com.google.gson.stream.JsonWriter@6a9454cd

gson.toJson(myobj, MyObj.class, writer); 方法是 void 类型,不返回 JSON 字符串。那么在这种情况下如何获取 JSON 字符串呢?

【问题讨论】:

    标签: java json rest gson


    【解决方案1】:

    那是因为您从 String objJson = writer.toString(); 获取 JSON 字符串。这不是您应该检索它的方式:此代码只会调用 writer 实例上的 toString() 方法。由于此对象为toString() is not overriden,因此结果为默认com.google.gson.stream.JsonWriter@6a9454cd

    您想要做的是获取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();
    

    【讨论】:

      【解决方案2】:

      不幸的是,将流转换为静态对象并不能避免 OOM 问题。无论哪种方式,您都在尝试分配/请求内存来构造/写入该字符串。您必须将结果流通过管道传输到另一个流,或者通过在某个循环中使用 BufferedWriter 或其他方式来简单地使用该流中的所有数据。

      【讨论】:

        【解决方案3】:

        试试这个。将 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-11
          • 2023-03-18
          • 2018-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-07
          • 2020-12-03
          相关资源
          最近更新 更多