当前位置:首页 > 技术 > 正文内容

深入理解.NET 9中JSON序列化的改进与新特性

访客 技术 2026年7月14日 1

.NET 9正式发布后,系统性地增强了JSON处理能力。本文将详细探讨.NET 9在JSON序列化领域引入的两项重要改进。

可自定义的缩进配置

在.NET 9之前,JsonSerializerOptions仅提供WriteIndented属性来控制是否格式化输出,但无法自定义缩进的具体形式。新版本引入了两个关键属性:

  • IndentChars:指定缩进使用的字符,默认为空格
  • IndentSize:指定每层缩进的字符数量,默认为2

这一改进使得开发者能够根据不同场景灵活调整JSON输出格式。

实际应用示例

using System;
using System.Text.Json;

var configuration = new JsonSerializerOptions
{
    WriteIndented = true,
    IndentChars = "\t",
    IndentSize = 1
};

string result = JsonSerializer.Serialize(
    new { Message = "Hello World" },
    configuration
);
Console.WriteLine(result);

输出结果:

{
    "Message": "Hello World"
}

典型使用场景

自定义缩进功能在以下场景中尤为实用:

  • 适配第三方系统的日志格式规范
  • 满足特定前端框架对JSON格式的严格要求
  • 在保持可读性的同时优化传输数据体积
  • 与现有代码库的缩进风格保持统一

完整演示代码

using System;
using System.Text.Json;

public class SerializeDemo
{
    public static void Main()
    {
        var employee = new
        {
            Name = "Bob",
            Department = "Engineering",
            Technologies = new[] { "C#", "SQL", "Redis" }
        };

        // 标准格式输出
        var standardConfig = new JsonSerializerOptions
        {
            WriteIndented = true
        };
        Console.WriteLine("标准格式:");
        Console.WriteLine(JsonSerializer.Serialize(employee, standardConfig));

        // 采用制表符缩进
        var tabConfig = new JsonSerializerOptions
        {
            WriteIndented = true,
            IndentChars = "\t",
            IndentSize = 1
        };
        Console.WriteLine("\n制表符缩进:");
        Console.WriteLine(JsonSerializer.Serialize(employee, tabConfig));

        // 采用4空格缩进
        var spaceConfig = new JsonSerializerOptions
        {
            WriteIndented = true,
            IndentChars = " ",
            IndentSize = 4
        };
        Console.WriteLine("\n四空格缩进:");
        Console.WriteLine(JsonSerializer.Serialize(employee, spaceConfig));
    }
}

运行结果展示:

标准格式(2空格缩进):

{
  "Name": "Bob",
  "Department": "Engineering",
  "Technologies": [
    "C#",
    "SQL",
    "Redis"
  ]
}

制表符缩进:

{
    "Name": "Bob",
    "Department": "Engineering",
    "Technologies": [
        "C#",
        "SQL",
        "Redis"
    ]
}

四空格缩进:

{
    "Name": "Bob",
    "Department": "Engineering",
    "Technologies": [
        "C#",
        "SQL",
        "Redis"
    ]
}

Web场景专用单例

.NET 9新增了JsonSerializerOptions.Web单例属性,专门为Web应用程序优化。该单例预设了符合Web开发习惯的序列化策略:

  • 自动采用camelCase命名策略
  • 默认忽略值为null的属性
  • 支持字符串形式的数字解析

此特性简化了ASP.NET Core等Web框架的JSON序列化配置。

基本用法

using System.Text.Json;

var payload = new { UserId = 100, Active = false };

string webJson = JsonSerializer.Serialize(
    payload,
    JsonSerializerOptions.Web
);
Console.WriteLine(webJson);
// 输出: {"userId":100}

实战案例

using System.Text.Json;

public class OrderItem
{
    public int ProductId { get; set; }
    public string ProductName { get; set; } = "Default Item";
    public int Quantity { get; set; } = 0;
    public string? Notes { get; set; }
}

public class WebSerializeDemo
{
    public static void Main()
    {
        var order = new OrderItem();

        string json = JsonSerializer.Serialize(order, JsonSerializerOptions.Web);
        Console.WriteLine(json);
    }
}

输出结果:

{"productId":0,"productName":"Default Item"}

分析输出可见:Quantity默认值为0被忽略,Notes为null也被过滤,仅保留了非默认值的属性。

应用价值

JsonSerializerOptions.Web在以下场景极具优势:

  • 构建RESTful API时自动生成符合前端约定的JSON格式
  • 减少前后端因命名风格差异导致的沟通成本
  • 自动过滤无意义的默认值,优化网络传输效率

总结

.NET 9对System.Text.Json的增强主要体现在两个方面:灵活可控的缩进配置以及开箱即用的Web场景优化。这些改进显著提升了开发体验,使JSON序列化更加便捷高效。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。