java - 流式写Json

标签 java json io stream gson

我在 ArrayList 中有一大组 JsonObject。我需要将这些 JsonObject 添加到 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();
}

请告诉我这是否是正确的做法。

最佳答案

您可以使用 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 的工作。

关于java - 流式写Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577848/

相关文章:

javascript - 将对象值提取到数组中

haskell - 函数式编程: Where does the side effect actually happen?

c - 为什么 fprintf 在线程中不起作用?

java - 在没有工具栏的浏览器中打开 URL

java - 如何使用 Micronaut 运行 KafkaStream 应用程序?

java相当于php "fnum"unpack函数将十六进制转换为java中的float IEEE 754

java - 什么是NullPointerException,我该如何解决?

javascript - Node 不记录更深的子对象

python - JSON 解码不适用于 Python 请求

JavaIO : Memory/Performance issue when reading “last lines” of files using bufferedReader