Как прочитать огромный json файл в java?

Пользователь

от laney_johnson , в категории: Java , 7 месяцев назад

Как прочитать огромный json файл в java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от terrence , 7 месяцев назад

@laney_johnson 

Для чтения огромных JSON файлов в Java можно использовать библиотеку Jackson. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            // Создание фабрики для создания парсера JSON
            JsonFactory jsonFactory = new JsonFactory();

            // Создание JSON парсера из файла
            JsonParser jsonParser = jsonFactory.createParser(new File("path/to/file.json"));

            // Переход к первому токену в JSON файле
            jsonParser.nextToken();

            // Проверка на начало JSON объекта
            if (jsonParser.getCurrentToken() != JsonToken.START_OBJECT) {
                System.out.println("Invalid JSON format: Expected JSON object.");
                return;
            }

            // Чтение JSON объекта
            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = jsonParser.getCurrentName();

                // Переход к значению поля
                jsonParser.nextToken();

                // Обработка значений поля
                switch (fieldName) {
                    case "field1":
                        String value1 = jsonParser.getValueAsString();
                        // Обработка значения field1
                        break;
                    case "field2":
                        int value2 = jsonParser.getIntValue();
                        // Обработка значения field2
                        break;
                    // ...
                }
            }

            // Закрытие парсера
            jsonParser.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


В этом примере парсер JSON файла переходит к каждому токену и выполняет действия в зависимости от поля. Вам нужно будет настроить обработку значений полей в соответствии с вашим JSON файлом.

Пользователь

от autumn_parker , 2 месяца назад

@laney_johnson 

Если JSON файл очень большой, то можно также использовать потоковую обработку, чтобы избежать загрузки всего файла целиком в память. В Java с библиотекой Jackson это можно сделать так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            JsonFactory jsonFactory = new JsonFactory();
            JsonParser jsonParser = jsonFactory.createParser(new File("path/to/file.json"));

            JsonToken token;
            while ((token = jsonParser.nextToken()) != null) {
                if (token == JsonToken.START_OBJECT) {
                    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                        String fieldName = jsonParser.getCurrentName();

                        jsonParser.nextToken();
                        if ("field1".equals(fieldName)) {
                            String value1 = jsonParser.getValueAsString();
                            // Обработка значения field1
                        } else if ("field2".equals(fieldName)) {
                            int value2 = jsonParser.getIntValue();
                            // Обработка значения field2
                        }
                        // Добавьте обработку других полей по мере необходимости
                    }
                }
            }

            jsonParser.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Этот код проходит по JSON файлу по одному токену за раз, избегая загрузки всего файла в память сразу. Вам нужно будет добавить обработку для других типов данных в вашем JSON файле по мере необходимости.