如何解决如何仅反序列化某些子树
我有一个类似的 JSON 文档
{
"outer":{
"inner":{ ... }
}
}
如何使用 "inner"
将 { ... }
(MyType
)的值反序列化为某种类型 System.Text.Json
?
解决方法
在 .NET 5 中,您可以将 JSON 反序列化为包装所需类型的匿名类型:
var myType = JsonSerializerExtensions.DeserializeAnonymousType(jsonString,new { outer = new { inner = default(MyType) } })
?.outer?.inner;
使用 Deserialize anonymous type with 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
}
这应该比反序列化为中间 JsonDocument
更高效。但请注意,这在 .NET Core 3.x 中不起作用,因为该版本不支持反序列化为具有参数化构造函数的类型。
演示小提琴here。
,您可以尝试使用 JsonDocument 类。下面链接中的一个部分解释了它如何与示例代码一起工作。
https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/
,您可以像这样使用 JsonDocument
:
public class MyType
{
public int id { get; set; }
}
var json = @"{
""outer"" : {
""inner"" : {""id"":1}
}}";
using (JsonDocument doc = JsonDocument.Parse(json))
{
var prop = doc.RootElement.GetProperty("outer").GetProperty("inner");
var myType = JsonSerializer.Deserialize<MyType>(prop.GetRawText());
}
但不确定在性能方面(我认为您可以使用一些 tricks 来提高这个简单解决方案的性能,但仍然)它会比创建相应的结构更好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。