一次反序列化 json 一条记录
Deserialize json one record at a time
我正在处理大型 json 文件,内存是个问题。我想一次从文件中将一个对象读入内存。这可能吗?
在 ServiceStack.Text 文档中说有一个 API 使用 reader/stream
但我看不出如何让它发挥作用。文件太大,无法一次性反序列化。 SS可以处理这种情况吗?
谢谢
不,您需要使用流式 JSON 解析器,例如 System.Text.Json Utf8JsonReader, this is the example on 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();
}
我正在处理大型 json 文件,内存是个问题。我想一次从文件中将一个对象读入内存。这可能吗?
在 ServiceStack.Text 文档中说有一个 API 使用 reader/stream
但我看不出如何让它发挥作用。文件太大,无法一次性反序列化。 SS可以处理这种情况吗?
谢谢
不,您需要使用流式 JSON 解析器,例如 System.Text.Json Utf8JsonReader, this is the example on 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();
}