使用System.Text.Json反序列化匿名类型

时间:2019-12-12 21:55:30

标签: c# json .net-core system.text.json .net-core-3.1

我正在更新.NET Core 3.x的一些应用程序,作为其中的一部分,我试图从Json.NET迁移到新的System.Text.Json类。使用Json.NET,我可以反序列化匿名类型,如下所示:

var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;

新名称空间中是否存在等效的方法?

3 个答案:

答案 0 :(得分:6)

从 .Net 5.0 开始,System.Text.Json 支持不可变类型(以及匿名类型)的反序列化。来自How to use immutable types and non-public accessors with System.Text.Json

<块引用>

System.Text.Json 可以使用参数化构造函数,这使得反序列化不可变类或结构成为可能。 对于一个类,如果唯一的构造函数是参数化的,则将使用该构造函数。

由于匿名类型只有一个构造函数,它们现在可以成功反序列化。为此,定义一个辅助方法,如下所示:

public static partial class JsonSerializerExtensions
{
    public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject, JsonSerializerOptions options = default)
        => JsonSerializer.Deserialize<T>(json, options);

    public static ValueTask<TValue> DeserializeAnonymousTypeAsync<TValue>(Stream stream, TValue anonymousTypeObject, JsonSerializerOptions options = default, CancellationToken cancellationToken = default)
        => JsonSerializer.DeserializeAsync<TValue>(stream, options, cancellationToken); // Method to deserialize from a stream added for completeness
}

现在你可以:

var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }).token;

演示小提琴here

答案 1 :(得分:0)

正如上面的dbc所指出的,这目前是不可能的。我们将JsonDocument视作一种解决方法,但它也缺少属性名称不区分大小写之类的内容。

因此,看来我们暂时仍会坚持使用Json.NET

答案 2 :(得分:0)

请尝试使用我写的作为System.Text.Json扩展的库来提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json

您将找到对匿名类型的支持。

通过调用JsonSerializerOptions来设置json扩展,该扩展方法是在命名空间Dahomey.Json中定义的扩展方法SetupExtensions:

JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();

然后使用JsonSerializerExtensions静态类型序列化您的类:

var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;