我正在为 .NET Core 3.x 更新一些应用程序,作为其中的一部分,我正在尝试Json.NET
从新System.Text.Json
类迁移。使用 Json.NET,我可以像这样反序列化匿名类型:
var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;
新命名空间中是否有等效方法?
我正在为 .NET Core 3.x 更新一些应用程序,作为其中的一部分,我正在尝试Json.NET
从新System.Text.Json
类迁移。使用 Json.NET,我可以像这样反序列化匿名类型:
var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;
新命名空间中是否有等效方法?
作为 。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;
演示小提琴在这里。
请尝试我作为 System.Text.Json 的扩展编写的这个库,以提供缺少的功能:https ://github.com/dahomey-technologies/Dahomey.Json 。
您会发现对匿名类型的支持。
通过调用命名空间 Dahomey.Json 中定义的扩展方法 SetupExtensions 调用 JsonSerializerOptions 来设置 json 扩展:
JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
然后使用 JsonSerializerExtensions 静态类型序列化您的类:
var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;