C# 如何反序列化ReadOnlySpan<;char>;使用System.Text.Json创建对象
我有一个例子,当我得到一个非常大的文本数据&每一行都包含一些元数据+json数据字符串。 我需要处理每行上的json数据 这就是我所拥有的:C# 如何反序列化ReadOnlySpan<;char>;使用System.Text.Json创建对象,c#,json,.net-core,json-deserialization,system.text.json,C#,Json,.net Core,Json Deserialization,System.text.json,我有一个例子,当我得到一个非常大的文本数据&每一行都包含一些元数据+json数据字符串。 我需要处理每行上的json数据 这就是我所拥有的: public Data GetData(string textLine) { var spanOfLine = textLine.AsSpan(); var indexOfComma = spanOfLine.IndexOf(":"); var dataJsonStringAsSpan = spanOfLine.Slice(inde
public Data GetData(string textLine)
{
var spanOfLine = textLine.AsSpan();
var indexOfComma = spanOfLine.IndexOf(":");
var dataJsonStringAsSpan = spanOfLine.Slice(indexOfComma + 1);
// now use dataJsonStringAsSpan which is ReadOnlySpan<char> to deserialize the Data
}
我正试图通过System.Text.Json
API来实现这一点。令人惊讶的是,它没有从ReadOnlySpan
进行反序列化的重载,因此我提出了以下建议:
public Data GetData(string textLine)
{
var spanOfLine = textLine.AsSpan();
var indexOfComma = spanOfLine.IndexOf(":");
var dataJsonStringAsSpan = spanOfLine.Slice(indexOfComma + 1);
var byteCount = Encoding.UTF8.GetByteCount(dataJsonStringAsSpan);
Span<byte> buffer = stackalloc byte[byteCount];
Encoding.UTF8.GetBytes(dataJsonStringAsSpan, buffer);
var data = JsonSerializer.Deserialize<Data>(buffer);
return data;
}
公共数据GetData(字符串文本行)
{
var spanOfLine=textLine.AsSpan();
var indexOfComma=spanOfLine.IndexOf(“:”);
var dataJsonStringAsSpan=spanOfLine.Slice(indexOfComma+1);
var byteCount=Encoding.UTF8.GetByteCount(dataJsonStringAsSpan);
Span buffer=stackalloc字节[字节计数];
Encoding.UTF8.GetBytes(dataJsonStringAsSpan,buffer);
var data=JsonSerializer.Deserialize(缓冲区);
返回数据;
}
虽然这是可行的,但它看起来非常复杂
这是一条路,还是我错过了一些更简单的东西?这同样有效吗?只要阅读你的代码,它看起来会做同样的事情
public Data GetData(string textLine)
{
var split = textLine.Split(new char[] {':'});
var data = JsonSerializer.DeserializeObject<Data>(split[1]);
return data;
}
公共数据GetData(字符串文本行)
{
var split=textLine.split(新字符[]{':'});
var data=JsonSerializer.DeserializeObject(拆分[1]);
返回数据;
}
是否有特殊原因需要将每行文本转换为span。。?字符串更容易使用,并且在json api中也更容易使用,如果您已经获得了一个字符串,为什么不直接获取包含json数据的子字符串呢?如果您的文本“非常大”,并且您不想为其创建字符串对象,那么您肯定不想使用stackalloc。您可以反序列化
dataJsonStringAsSpan.ToString()
(ReadOnlySpan
上的ToString是“将这些内容复制到字符串中”,而不是“作为调试辅助/显示值”),您可以将您的问题分享给我们一个您尝试反序列化的JSON(简化)示例吗?此外,如果您的JSON非常大,那么您不想首先将其加载到单个字符串中,它将进入大型对象堆,并可能消除您使用System.Text.JSON
所获得的任何优势。(也许我误解了,每个文本行都不是很大?)您是从本地文件、HTTP响应还是其他地方读取JSON?如果您绝对需要最小化内存压力,您可以看到Microsoft如何实现反序列化(字符串JSON,类型returnType,JsonSerializerOptions options=null)
。看起来您可以使用附加参数int start、int length
创建自己的代码版本,并将这些参数传递给。您还需要来自的几个方法的您自己的版本。“我不确定这是否值得。捕捉得很好,”KlayconSorry对迟来的回应说。这将做的工作,但这正是我试图避免在第一位。那textLine.Split(新字符[]{':'})
将为每一行分配一个数组(另一个数组是因为您有新字符[]{':'}
并且有许多行需要处理)。@Mike这是真的,但它们都是局部变量,应该很快被GC处理。在整个过程中,内存的使用应该非常少。我想试试,但我打赌你不会有任何严重的记忆问题。
public Data GetData(string textLine)
{
var split = textLine.Split(new char[] {':'});
var data = JsonSerializer.DeserializeObject<Data>(split[1]);
return data;
}