流式写入 Json

Posted

技术标签:

【中文标题】流式写入 Json【英文标题】:Streaming to write Json 【发布时间】:2014-03-01 22:03:53 【问题描述】:

我在ArrayList 中有大量JsonObjects。我需要将这些JsonObjects 添加到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的主要内容,如果未能解决你的问题,请参考以下文章

WriteStream 无法在 Delta 表中写入数据

如何将流式数据帧写入 PostgreSQL?

Spark 结构化流式 Elasticsearch 集成问题。数据源es不支持流式写入

写入云存储时 GAE 内存泄漏,我可以流式传输吗?

使用 Python 向 Google Cloud Storage 写入流式传输

实时即未来,大数据项目车联网之原始数据实时ELT流式任务流程总结