【问题标题】:Streaming one JSON object after another having a JSON array in one huge line in the file流式传输一个又一个 JSON 对象,在文件的一大行中有一个 JSON 数组
【发布时间】:2018-01-11 20:41:27
【问题描述】:

我有一个包含 JSON 对象数组的巨大 JSON 文件 (1GB) 的问题,但它们都在一行中。所以看起来……

[{JsonObject1},{JsonObject1},{JsonObject1},...,{JsonObject999999}]

我无法将内容保存到内存中,因此我想使用流式传输来执行此操作。我知道如何逐行流式传输,但是如果我只有一行中的所有内容,我如何才能从这一行数组中一个接一个地流式传输 JSON 对象? 我试图浏览互联网,但我找不到任何东西:(

【问题讨论】:

  • 你能编辑文件吗?
  • @FrancisBartkowiak 不,我不是,太大了,我想把它分成小块
  • 好的。你说它是一个文件,所以我建议在 Notepad++ 中打开它并做一些查找和替换以添加换行符,这样更容易阅读。
  • @FrancisBartkowiak 不,我不可能有 1GB 数据和 700K JSON 对象在一个数组中
  • 我建议看看这个:stackoverflow.com/a/18209319/8972283

标签: java json stream


【解决方案1】:

使用google gson,你可以创建一些惰性操作的东西:

在此作为 Gist 维护:

<script src="https://gist.github.com/smac89/bdcb9b08fcdf9d055150824d57ab3513.js"></script>
import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Iterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class ReadJsonFile {
    private static final class JsonIterator<T> implements Iterator<T> {
        private final Gson gson;
        private final Type objectType;
        private final JsonReader reader;

        private JsonIterator(JsonReader reader, Gson gson, Type objectType) {
            this.gson = gson;
            this.objectType = objectType;
            this.reader = reader;
        }

        @Override
        public boolean hasNext() {
            try {
                return reader.hasNext();
            } catch (IOException ioe) {
                return false;
            }
        }

        @Override
        public T next() {
            return gson.fromJson(reader, objectType);
        }
    }

    public static <J> Stream<J> readJsonFromFile(Gson gson, URL jsonFile, Type type) throws IOException {
        JsonReader reader = new JsonReader(
                new BufferedReader(new InputStreamReader(jsonFile.openStream())));
        reader.beginArray();
        if (!reader.hasNext()) {
            return Stream.empty();
        }
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                new JsonIterator<J>(reader, gson, type), 0), false).onClose(() -> {
            try {
                reader.close();
            } catch (IOException ioe) {
            }
        });
    }
}

data.json

&lt;script src="https://gist.github.com/smac89/15fc3bffa4f965d18587eec2db4972dd.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2020-11-14
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多