流式写入 Json
Posted
技术标签:
【中文标题】流式写入 Json【英文标题】:Streaming to write Json 【发布时间】:2014-03-01 22:03:53 【问题描述】:我在ArrayList
中有大量JsonObject
s。我需要将这些JsonObject
s 添加到JsonArray
中并将其写入文件中。我正在使用Gson
,下面是我的代码。
private void myWriter(List<JsonObject> jsonObjectHolder, int number) throws IOException
System.out.println("Starting to write the JSON File");
//Add everything into a JSONArray
JsonArray jsonArrayNew = new JsonArray();
for(int i=0;i<jsonObjectHolder.size();i++)
//System.out.println("inside array: "+i);
JsonObject o = jsonObjectHolder.get(i);
System.out.println("inside array "+i+": "+o.get("title"));
jsonArrayNew.add(jsonObjectHolder.get(i));
System.out.println("Size: "+jsonArrayNew.size());
//Write it to the File
File file= new File("items.json");
FileWriter fw = new FileWriter(file);;
fw.write(jsonArrayNew.toString());
fw.flush();
fw.close();
System.out.println("outside array");
我不喜欢这种方式。 ArrayList
包含大量数据,我编写的方式可以生成 OutOfMemoryError
。相反,我想流式传输并将这些写入文件。
更新
根据 SO 用户“Alden”的回答,这里是我如何编辑代码的。
private void myWriter(List<JsonObject> jsonObjectHolder) throws IOException
JsonWriter writer = new JsonWriter(new FileWriter(new File("items.json")));
Gson gson = new Gson();
writer.beginArray();
for (JsonObject jsonObject : jsonObjectHolder)
gson.toJson(jsonObject, writer);
writer.endArray();
writer.close();
请告诉我这是否是正确的做法。
【问题讨论】:
【参考方案1】:您可以像这样使用 Gson 流式传输您的列表:
private void myWriter(List<JsonObject> jsonObjectHolder, Gson gson) throws IOException
JsonWriter writer = new JsonWriter(new FileWriter(new File("items.json")));
writer.beginArray();
for (JsonObject jsonObject : jsonObjectHolder)
gson.toJson(jsonObject, writer);
writer.endArray();
writer.close();
这假设您有一个可以使用的Gson
实例。如果不这样做,您可以使用 writer.beginObject()
和 writer.endObject()
并手动向编写器添加属性,但我不建议这样做,因为您已经完成了构建 JsonObject
的工作。
【讨论】:
感谢您的回复。 Gson 对象的意思是,就这么简单?Gson g = new Gson()
。我可以简单地在方法中创建这个实例,对吗?
是的,你可以。如果您需要custom serializers,您可能希望在其他地方创建它,但您不应该在这里,因为您正在处理JsonObject
,所以内联很好。
感谢您的回复。我更新了我的帖子,包括你的回答。请看一看。
好的,我的回答有问题吗?或者还有其他您正在寻找的东西吗?看来这可以解决您的问题
我认为他不想制作完整的对象然后编写它,而是将其写为它正在收集(从数据库或其他地方),因此在生成每一行时编写它。这种方式不需要写入内存数组。直接输出流。您的帖子对此有所帮助。以上是关于流式写入 Json的主要内容,如果未能解决你的问题,请参考以下文章
Spark 结构化流式 Elasticsearch 集成问题。数据源es不支持流式写入