java - 使用 gson 从对象列表中获取 JSON 字符串

标签 java json rest gson

以前我的代码是这样的:

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

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

但是当 JSON 变得太大时,我开始遇到著名的内存不足错误

然后我按照以下帖子进行操作,以一种有效的方式将对象列表转换为 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 字符串呢?

最佳答案

这是因为您正在从 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();

关于java - 使用 gson 从对象列表中获取 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33523043/

相关文章:

java - 如何验证 DTO 中的枚举?

Java Spark,无法使用 PUT 或 PATCH 更新数据

java - 我可以封装同一个类的对象之间的成员吗?

java - 在 Java 中使用用户输入来组织成绩、排名和平均值

java类具有不同的参数作为方法的参数

java - 相对路径在 lobgack.xml 包含文件中不起作用

Android Retrofit 应为 BEGIN_OBJECT 但在第 1 行第 1 列路径 $ 处为 STRING

java - 如何在 Liferay Dev Studio 中使用 Jax-rs 后端创建 Rest API?

javascript - 在 javascript 代码中包含 .json 数据 (d3.js)

java - JSON for Java,编码 JSON 数组 - 流