JSON解析器从大型JSON文件中逐个读取条目。

4
我是一个有用的助手,可以为您翻译文本。
我有一个巨大的JSON文件(1GB),基本上是以下格式的对象数组。
[{"x":"y", "p":"q"}, {"x1":"y1", "p1":"q1"},....]

我希望解析这个文件时,所有数据都不会加载到内存中。
基本上,我想要获取例如:前1000个对象在数组中进行内存处理,然后获取下一个1000个对象到内存中进行处理,以此类推直到读取所有数据。
是否有支持此用例的JSON库?我目前使用的是 Gson。但是当我调用 gson.fromJson() 时,它会将所有数据加载到内存中。

先行感谢您的帮助。

2个回答

1

使用Jackson,你可以使用类似SAX的方法(流式处理)来使用JsonParser对象,对于你的情况,代码可能类似于这样:

JsonFactory jsonFactory = new JsonFactory();
JsonParser parser = jsonFactory.createParser(new File("/path/to/my/jsonFile"));

// Map where to store your field-value pairs per object
Map<String, String> fields = new HashMap<String, String>();

JsonToken token;
while ((token = parser.nextToken()) != JsonToken.END_ARRAY) {
    switch (token) {

        // Starts a new object, clear the map
        case START_OBJECT:
            fields.clear();
            break;

        // For each field-value pair, store it in the map 'fields'
        case FIELD_NAME:
            String field = parser.getCurrentName();
            token = parser.nextToken();
            String value = parser.getValueAsString();
            fields.put(field, value);
            break;

        // Do something with the field-value pairs
        case END_OBJECT:
            doSomethingWithTheObject(fields)
            break;
        }
    }
    parser.close();

嗨,morgano。在Jackson或Gson中,是否可以给定从文件开头的字节偏移量,从该偏移量读取下一个标记? 基本上,我有一个从文件开头的字节偏移量,并且我想从该偏移量读取下一个项目。 - Bourne
еҰӮжһңдҪ жғіи·іиҝҮдёҖдәӣеӯ—иҠӮзҡ„ејҖеӨҙпјҢиҜ·е°қиҜ•д»ҘдёӢж–№жі•пјҡдёҚиҰҒдҪҝз”ЁcreateParser(File)пјҢиҖҢжҳҜдҪҝз”ЁcreateParser(InputStream)гҖӮйҰ–е…Ҳд»Һж–Ү件дёӯеҲӣе»әдёҖдёӘFileInputStreamпјҢ然еҗҺиҜ»еҸ–жӮЁжғіиҰҒи·іиҝҮзҡ„еӯ—иҠӮж•°пјҢжңҖеҗҺдҪҝз”ЁзӣёеҗҢзҡ„FileInputStreamдҪҝз”ЁcreateParserгҖӮ - morgano

1

在Jackson或Gson中,是否可以根据文件开头的字节偏移量读取下一个标记?基本上,我有一个从文件开头的字节偏移量,并且我想从该偏移量读取下一个项目。 - Bourne
你尝试使用 BufferedReaderskip 了吗?http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html - arghbleargh
在 BufferedReader 中是否可以获取文件指针的位置?我想要基本上从文件开头获取字符或字节偏移量。 - Bourne
默认情况下,它从文件的开头开始...例如,要跳过7个字节:br = new BufferedReader(new FileReader("file.txt")); br.skip(7); - arghbleargh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接