以前我的代码是这样的:
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/