JSON解析器从大型JSON文件中按条目读取条目

时间:2013-08-14 11:40:30

标签: java json memory gson scalability

我有一个巨大的JSON文件(1GB),它基本上是以下格式的对象数组

[{"x":"y", "p":"q"}, {"x1":"y1", "p1":"q1"},....]

我想解析这个文件,所有数据都没有加载到内存中 基本上我想得到例如:数组中的前1000个对象进行内存处理然后将接下来的1000个对象放入内存进程中,依此类推,读取所有数据。
是否有支持此用例的JSON库?我目前使用 Gson 。但是,当我调用gson.fromJson()

时,它会将所有数据加载到内存中

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

看起来Gson有一个流API,这就是你想要的:https://sites.google.com/site/gson/streaming

答案 1 :(得分: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();