.NET Core 3 及更高版本中,将 JsonElement 转换为对象的方法
本文探讨如何在 .NET Core 3 及更高版本中使用 System.Text.Json
将 JsonElement
转换为对象。System.Text.Json
是 .NET Core 3.0 中新的 JSON 处理库,它不包含 Json.NET
中的 ToObject()
方法的等效项,而该方法允许将 JToken
转换为类。
.NET 6 及更高版本:
从 .NET 6 开始,JsonSerializer
提供了扩展方法,可以直接从 JsonElement
或 JsonDocument
反序列化:
<code class="language-csharp">public static TValue? Deserialize<TValue>(this JsonDocument document, JsonSerializerOptions? options = null); public static object? Deserialize(this JsonDocument document, Type returnType, JsonSerializerOptions? options = null);</code>
使用这些方法,您可以轻松地从 JsonElement
反序列化对象:
<code class="language-csharp">var myClass = jDoc.RootElement.GetProperty("SomeProperty").Deserialize<MyClass>();</code>
.NET 5 及更早版本:
在 .NET 的早期版本中,这些方法不可用。解决方法是将 JSON 写入中间字节缓冲区:
<code class="language-csharp">public static partial class JsonExtensions { public static T ToObject<T>(this JsonElement element, JsonSerializerOptions options = null) { var bufferWriter = new ArrayBufferWriter<byte>(); using (var writer = new Utf8JsonWriter(bufferWriter)) element.WriteTo(writer); return JsonSerializer.Deserialize<T>(bufferWriter.WrittenSpan, options); } }</code>
此方法比先将 JsonElement
转换为字符串的性能更好。
注意事项:
JsonDocument
的释放: JsonDocument
使用的是池化内存,因此需要妥善释放(建议使用 using
语句)。JsonNode
的类似方法: 对于可变的 JSON 文档节点 JsonNode
,也存在类似的方法。以上是如何将 JsonElement 转换为 .NET 的 System.Text.Json 中的对象?的详细内容。更多信息请关注PHP中文网其他相关文章!