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

时间:2019-11-13 21:27:10

标签: 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(indexOfComma + 1);

    // now use dataJsonStringAsSpan which is ReadOnlySpan<char> to deserialize the Data
}

数据是Dto类,它具有(7)种不同的属性:

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

    public double Attribute2 { get; set; }
    // ... more properties, emitted for the sake of brevity
}

我正在尝试使用System.Text.Json API来实现这一目标。令人惊讶的是,从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;
}

虽然可行,但看起来很复杂。

这是要走的路还是我缺少更简单的东西?

1 个答案:

答案 0 :(得分:0)

这项工作会一样吗?只是阅读您的代码,看起来它会做同样的事情...

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