Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反序列化ReadOnlySpan<;char>;使用System.Text.Json创建对象_C#_Json_.net Core_Json Deserialization_System.text.json - Fatal编程技术网

C# 如何反序列化ReadOnlySpan<;char>;使用System.Text.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

我有一个例子,当我得到一个非常大的文本数据&每一行都包含一些元数据+json数据字符串。 我需要处理每行上的json数据

这就是我所拥有的:

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;
}