Читайте одну запись одновременно с System.Text. Json - PullRequest
2 голосов
/ 09 января 2020

Я пытаюсь прочитать одну json запись в память за раз, используя. net core 3.0.

Эта страница: https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

Дает этот пример, используя читателя:

byte[] data = Encoding.UTF8.GetBytes(json);
Utf8JsonReader reader = new Utf8JsonReader(data, isFinalBlock: true, state: default);

while (reader.Read())
{
    Console.Write(reader.TokenType);

    switch (reader.TokenType)
    {
        case JsonTokenType.PropertyName:
        case JsonTokenType.String:
        {
            string text = reader.GetString();
            Console.Write(" ");
            Console.Write(text);
            break;
        }

        case JsonTokenType.Number:
        {
            int value = reader.GetInt32();
            Console.Write(" ");
            Console.Write(value);
            break;
        }

        // Other token types elided for brevity
    }

    Console.WriteLine();
}

В этом примере он загружает весь байтовый массив. Моя главная проблема - это память, поскольку я имею дело с большими json файлами, я не хочу загружать все это, только текущую запись, над которой работаем (или, по крайней мере, меньший фрагмент).

Я не знаете, как передать поток байтов в Utf8JsonReader и читать по одной записи за раз.

Какой простой способ читать по одной записи за раз с. net core 3.0?

1 Ответ

1 голос
/ 09 января 2020

Способом достижения этой формы функциональности будет использование JSON формата файла Линии с классом StreamReader. JSON Расширение файла Lines: .jsonl.

Это добавляет в строку JSON символ новой строки после каждого объекта JSON. При этом вы можете использовать StreamReader.ReadLine, а затем просто десериализовать всю строку.

Подробнее см. JSON Линии http://jsonlines.org/.

...