我正在更新一些针对.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;
在新的命名空间中是否有等效的方法?
System.Text.Json
支持反序列化不可变类型(包括匿名类型)。来自如何使用不可变类型和非公共访问器与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;
这里提供演示版的代码 链接
。JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;
JsonConverter
来实现,但是以通用的方式来做会比较棘手和复杂。 - dbc