首页 >后端开发 >C++ >如何将 JsonElement 转换为 .NET 的 System.Text.Json 中的对象?

如何将 JsonElement 转换为 .NET 的 System.Text.Json 中的对象?

Barbara Streisand
Barbara Streisand原创
2025-01-08 15:27:401041浏览

.NET Core 3 及更高版本中,将 JsonElement 转换为对象的方法

本文探讨如何在 .NET Core 3 及更高版本中使用 System.Text.JsonJsonElement 转换为对象。System.Text.Json 是 .NET Core 3.0 中新的 JSON 处理库,它不包含 Json.NET 中的 ToObject() 方法的等效项,而该方法允许将 JToken 转换为类。

.NET 6 及更高版本:

从 .NET 6 开始,JsonSerializer 提供了扩展方法,可以直接从 JsonElementJsonDocument 反序列化:

<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 语句)。
  • 新方法的可用性: 新的反序列化扩展方法在 .NET 6.0 Preview RC1 及更高版本中可用。
  • JsonNode 的类似方法: 对于可变的 JSON 文档节点 JsonNode,也存在类似的方法。

How to Convert a JsonElement to an Object in .NET's System.Text.Json?

以上是如何将 JsonElement 转换为 .NET 的 System.Text.Json 中的对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn