3

我正在尝试使用 .net core 3.0 一次将单个 json 记录读入内存。

本页: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一次读取一条记录的简单方法是什么?

4

1 回答 1

2

实现这种形式的功能的方法是使用带有StreamReader类的 JSON Lines 文件格式。JSON 行文件扩展名为 .jsonl。

这会在每个 JSON 对象之后使用换行符修改 JSON 字符串。有了这个,您可以使用StreamReader.ReadLine然后反序列化整行。

有关更多详细信息,请参阅 JSON 行http://jsonlines.org/

于 2020-01-09T19:24:43.247 回答