如何使用 System.Text.Json 将 ReadOnlySpan<char> 反序列化为对象

Mik*_*ike 5 c# json json-deserialization .net-core system.text.json

我有一个例子,当我得到一个非常大的文本数据并且每行包含一些元数据+ 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
}
Run Code Online (Sandbox Code Playgroud)

其中 Data 是一个 Dto 类,它具有一堆 (7) 不同的属性:

public class Data
{
    public int Attribute1 { get; set; }

    public double Attribute2 { get; set; }
    // ... more properties, emitted for the sake of brevity
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过System.Text.JsonAPI 来实现这一点。令人惊讶的是,它没有任何可以反序列化的重载ReadOnlySpan<char>,所以我想出了这个:

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;
}
Run Code Online (Sandbox Code Playgroud)

虽然这可行,但看起来非常复杂。

这是要走的路还是我错过了更简单的东西?

out*_*red -2

这会起到同样的作用吗?只是阅读你的代码,看起来它会做同样的事情......

public Data GetData(string textLine)
{
    var split = textLine.Split(new char[] {':'});
    var data = JsonSerializer.DeserializeObject<Data>(split[1]);
    return data;
}
Run Code Online (Sandbox Code Playgroud)