【发布时间】:2020-01-08 14:14:20
【问题描述】:
我正在处理大型 json 文件,内存是一个问题。我想从文件中一次将一个对象读入内存。这可能吗?
在 ServiceStack.Text 文档中它说有一个使用阅读器/流的 API
但我不知道如何让它发挥作用。文件太大,无法一次性反序列化。 SS可以处理这种情况吗?
谢谢
【问题讨论】:
标签: servicestack
我正在处理大型 json 文件,内存是一个问题。我想从文件中一次将一个对象读入内存。这可能吗?
在 ServiceStack.Text 文档中它说有一个使用阅读器/流的 API
但我不知道如何让它发挥作用。文件太大,无法一次性反序列化。 SS可以处理这种情况吗?
谢谢
【问题讨论】:
标签: servicestack
不,你会想要使用像 System.Text.Json Utf8JsonReader 这样的流式 JSON 解析器,这是 System.Text.Json introductory page 上的示例:
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();
}
【讨论】:
System.IO.Pipelines 和ReadOnlySequence<byte> 或ReadOnlySpan<byte> 输入,not 字节数组。跨度和序列不是数组,它们是管道生成的数据的视图。整个System.Text.Json 命名空间是为一个非常特定的场景而构建的,牺牲了易用性来换取性能和最小的内存使用量