Как получить данные из определенного индекса в json-файле java - PullRequest
0 голосов
/ 28 апреля 2018

JSONParser анализирует все объекты json в данном файле, но я хочу проанализировать объекты json, начиная с 100-й index до конца файла.

Я могу сделать это позже, используя subList, но если в моем файле json есть 1 миллион объектов json, я не хочу анализировать все, потому что эффективность будет снижена.

public static void readJsonFile() {

    JSONParser parser = new JSONParser();

    try {
        JSONArray a = (JSONArray) parser.parse(new FileReader("D:\\2018-4-21.json"));

        for (Object o : a.subList(100,a.size())) {
            JSONObject checkIn = (JSONObject) o;

            String userId = (String) checkIn.get("UserID");
            System.out.print(userId);

            String inout = (String) checkIn.get("INOUT");
            System.out.print("   " + inout);

            String swippedDateTime = (String) checkIn.get("SwippedDateTime");
            System.out.print("   " + swippedDateTime);

            System.out.println("");
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (org.json.simple.parser.ParseException e) {
        e.printStackTrace();
    }
}

My Json File

[
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:25"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:36"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:36"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:36"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:38"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:38"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:38"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:39"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:39"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:39"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:42"
    },
    {
        "UserID": "2",
        "INOUT": null,
        "SwippedDateTime": "2018-4-23 22:49"
    }
]

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Если у вас есть 1 000 000 записей, использование памяти является проблемой.

Самый эффективный способ сделать это - вручную прочитать первую часть файла - в случае, если вы показали, что все ваши записи имеют одинаковый размер, так что вы можете просто использовать InputStream.skip() - конечно если ваши строковые поля, такие как UserID, могут иметь разную длину, это не сработает.

Вы можете читать файл символ за символом, считая (скажем) запятые, чтобы определить, когда вы пропустили 100 записей.

После того, как вы пропустили первую часть файла, вы должны использовать потоковый анализатор, чтобы прочитать остальную часть. Gson сделает это: https://sites.google.com/site/gson/streaming

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

0 голосов
/ 28 апреля 2018

Единственный способ найти индекс 100 - это разобрать все до индекса 100.

Я думаю, что вы действительно спрашиваете, как это сделать без создания ненужных объектов в памяти.

Ответ на этот вопрос может также помочь вам управлять файлами с миллионами записей без нехватки памяти:

Использование потокового синтаксического анализатора.

С помощью потокового анализатора вы получите данные при их разборе, поэтому вы можете быстро пропустить первые X-записи, а затем начать обрабатывать записи по одной за раз, поэтому вам никогда не придется хранить более одной записи в памяти.

Это означает, что вы можете анализировать файлы неограниченного размера с очень маленьким объемом памяти.

Поскольку вы используете GSON, это означает, что вам нужно использовать JsonReader вместо JsonParser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...