.NET 中的 JSON 序列化和反序列化 - 概述

System.Text.Json 命名空间提供对 JavaScript 对象表示法(JSON)进行序列化和反序列化(或者编组和解组)的功能。 序列化是将对象状态(即其属性的值)转换为可存储或传输的形式的过程。 序列化形式不包含有关对象的关联方法的任何信息。 反序列化从序列化形式重新构造对象。

System.Text.Json 库的设计强调对广泛的功能集实现高性能和低内存分配。 内置的 UTF-8 支持可优化读写以 UTF-8 编码的 JSON 文本的过程,UTF-8 编码是针对 Web 上的数据和磁盘上的文件的最普遍的编码方式。

库还提供了用于处理内存中文档对象模型 (DOM) 的类。 此功能允许对 JSON 文件或字符串中的元素进行随机访问。

对于 Visual Basic,可以使用的库部分有一些相关限制。 有关详细信息,请参阅 Visual Basic 支持

如何获取库

该库是作为 .NET Core 3.0 及更高版本共享框架的一部分内置的。 源生成功能内置在 .NET 6 和更高版本的共享框架中。

对于早于 .NET Core 3.0 的框架版本,请安装 System.Text.Json NuGet 包。 包支持以下框架:

  • .NET Standard 2.0 及更高版本
  • .NET Framework 4.6.2 及更高版本
  • .NET 8 及更高版本

命名空间和 API

重要

System.Text.Json 不支持以前可能使用过的以下序列化 API:

反射与源生成

默认情况下,System.Text.Json 使用反射来收集所需的元数据,用于在运行时访问对象属性以进行序列化和反序列化。 作为替代方法,System.Text.Json 可以使用 C# 源生成功能来提高性能、降低专用内存使用量以及推动程序集修整,从而缩小应用大小。

有关详细信息,请参阅反射与源生成

安全信息

有关在设计 JsonSerializer 时考虑的安全威胁以及如何缓解这些威胁的信息,请参阅 System.Text.Json 威胁模型

线程安全

System.Text.Json 序列化程序在设计时考虑到了线程安全性。 实际上,这意味着锁定后,JsonSerializerOptions 实例就可以在多个线程之间安全地进行共享。 JsonDocument 为 JSON 值提供不可变且在 .NET 8 及更高版本中为线程安全的 DOM 表示形式。

其他资源