使用 System.Text.Json 反序列化匿名类型
Deserialize anonymous type with System.Text.Json
我正在为 .NET Core 3.x 更新一些应用程序,作为其中的一部分,我正在尝试从 Json.NET
迁移到新的 System.Text.Json
类 .使用 Json.NET,我可以像这样反序列化匿名类型:
var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;
新命名空间中是否有等效方法?
请试试我写的这个库作为 System.Text.Json 的扩展来提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json.
您会发现对匿名类型的支持。
通过在 JsonSerializerOptions 上调用命名空间 Dahomey.Json:
中定义的扩展方法 SetupExtensions 来设置 json 扩展
JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
然后使用 JsonSerializerExtensions 静态类型序列化您的 class:
var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;
从 .Net 5.0 开始,System.Text.Json
支持不可变类型的反序列化——因此也支持匿名类型。来自 How to use immutable types and non-public accessors with System.Text.Json:
System.Text.Json
can use a parameterized constructor, which makes it possible to deserialize an immutable class or struct. For a class, if the only constructor is a parameterized one, that constructor will be used.
由于匿名类型只有一个构造函数,它们现在可以成功反序列化。为此,请像这样定义一个辅助方法:
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;
演示 fiddle here.
我正在为 .NET Core 3.x 更新一些应用程序,作为其中的一部分,我正在尝试从 Json.NET
迁移到新的 System.Text.Json
类 .使用 Json.NET,我可以像这样反序列化匿名类型:
var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;
新命名空间中是否有等效方法?
请试试我写的这个库作为 System.Text.Json 的扩展来提供缺少的功能:https://github.com/dahomey-technologies/Dahomey.Json.
您会发现对匿名类型的支持。
通过在 JsonSerializerOptions 上调用命名空间 Dahomey.Json:
中定义的扩展方法 SetupExtensions 来设置 json 扩展JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();
然后使用 JsonSerializerExtensions 静态类型序列化您的 class:
var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;
从 .Net 5.0 开始,System.Text.Json
支持不可变类型的反序列化——因此也支持匿名类型。来自 How to use immutable types and non-public accessors with System.Text.Json:
System.Text.Json
can use a parameterized constructor, which makes it possible to deserialize an immutable class or struct. For a class, if the only constructor is a parameterized one, that constructor will be used.
由于匿名类型只有一个构造函数,它们现在可以成功反序列化。为此,请像这样定义一个辅助方法:
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;
演示 fiddle here.