.NET 9已经发布有一段时间了,近期整理一下.NET 9的新特性,今天重点分享.NET 9 JSON序列化方面的改进。

先引用官方的说明:

在 System.Text.Json 中,.NET 9 提供了用于序列化 JSON 的新选项和新的单一实例,可以更轻松地使用 Web 默认值进行序列化。

举个实际的例子,

缩进选项

JsonSerializerOptions 包括新的属性,可支持自定义写入 JSON 的缩进字符和缩进大小。

var options = new JsonSerializerOptions
{
WriteIndented = true,
IndentCharacter = '\t',
IndentSize = 2,
}; string json = JsonSerializer.Serialize(
new { Value = 1 },
options
);
Console.WriteLine(json);

实际的效果

//{
// "Value": 1
//}

  

大家不禁会问,这有什么用?

JsonSerializerOptions 新增了对自定义 JSON 缩进字符和缩进大小的支持。这项特性主要通过两个新属性实现:

  1. IndentChars: 指定用于缩进的字符(默认为空格 " ")。
  2. IndentSize: 指定缩进的大小(默认为 2)。

这些属性使开发者能够更灵活地控制生成的 JSON 格式,适应不同的需求,比如:

  • 日志格式优化: 某些系统对日志的可读性有特定要求,需要用不同的缩进字符(例如制表符 \t)或更大的缩进层次,以更容易定位层次结构。

  • 前端需求匹配: 一些前端框架可能要求特定的 JSON 格式(例如 4 个空格的缩进),以便与前端代码风格保持一致。

  • 节省空间: 在生成用于传输或存储的美化 JSON 时,调整缩进字符或大小可以帮助减少文件体积。

  • 与外部工具集成: 某些外部工具或系统对 JSON 的缩进风格有特定要求,自定义这两项属性可以轻松实现兼容。

  

继续给一个示例代码

using System;
using System.Text.Json; public class Program
{
public static void Main()
{
var data = new
{
Name = "Alice",
Age = 30,
Skills = new[] { "C#", "ASP.NET Core", "Blazor" }
}; // 默认缩进格式
var defaultOptions = new JsonSerializerOptions
{
WriteIndented = true
};
Console.WriteLine("默认格式:");
Console.WriteLine(JsonSerializer.Serialize(data, defaultOptions)); // 使用自定义缩进字符(制表符)和大小
var customOptions = new JsonSerializerOptions
{
WriteIndented = true,
IndentChars = "\t", // 使用制表符
IndentSize = 1 // 每层缩进 1 个制表符
};
Console.WriteLine("\n自定义制表符缩进:");
Console.WriteLine(JsonSerializer.Serialize(data, customOptions)); // 使用自定义空格缩进
var customSpaceOptions = new JsonSerializerOptions
{
WriteIndented = true,
IndentChars = " ", // 使用空格
IndentSize = 4 // 每层缩进 4 个空格
};
Console.WriteLine("\n自定义空格缩进:");
Console.WriteLine(JsonSerializer.Serialize(data, customSpaceOptions));
}
}

输出数据示例

1. 默认格式

{
"Name": "Alice",
"Age": 30,
"Skills": [
"C#",
"ASP.NET Core",
"Blazor"
]
}

2.自定义制表符缩进

{
"Name": "Alice",
"Age": 30,
"Skills": [
"C#",
"ASP.NET Core",
"Blazor"
]
}

3. 自定义空格缩进

{
"Name": "Alice",
"Age": 30,
"Skills": [
"C#",
"ASP.NET Core",
"Blazor"
]
}

这种灵活性让开发者能根据不同的上下文需求生成适合的 JSON 输出,既方便了可读性,也提升了兼容性。

 然后,我们继续看新的单一实例
如果要使用 ASP.NET Core 用于 Web 应用的默认选项进行序列化,请使用新的 JsonSerializerOptions.Web 单一实例。
string webJson = JsonSerializer.Serialize(
new { SomeValue = 42 },
JsonSerializerOptions.Web // Defaults to camelCase naming policy.
);
Console.WriteLine(webJson);
// {"someValue":42}

其实就是给JsonSerializerOptions多了一个Web选项。官方的解释:

意会之后,整理了以下说明:

JsonSerializerOptions.Web 是一个新的单例实例,专为 Web 应用程序设计,提供了默认的 JSON 序列化选项。它的主要特点包括:

  • 属性命名策略:将属性名称从 PascalCase 转换为 camelCase,以符合 JavaScript 的命名惯例。

  • 忽略默认值:在序列化过程中,忽略属性的默认值(如 null0false),以减少传输的数据量。

  • 数字处理:允许从字符串读取数字,以提高灵活性。

这些默认设置使得在 Web 环境中进行 JSON 序列化时,无需手动配置即可获得符合 Web 标准的输出。

实际应用场景

  • Web API 开发:在构建 RESTful API 时,使用 JsonSerializerOptions.Web 可以确保返回的 JSON 数据符合前端的预期格式,减少前后端数据格式不一致的问题。

  • 前后端一致性:通过自动将属性名称转换为 camelCase,避免了前端在处理 JSON 数据时的额外转换工作,提高开发效率。

给个示例代码看看效果

using System.Text.Json;

public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "Sample Product";
public decimal Price { get; set; } = 0.0m; // 默认值
public string? Description { get; set; } = null; // 可空类型
} public class Program
{
public static void Main()
{
var product = new Product(); // 使用 JsonSerializerOptions.Web 进行序列化
string json = JsonSerializer.Serialize(product, JsonSerializerOptions.Web); Console.WriteLine(json);
}
}

输出的JSON数据

{
"id": 0,
"name": "Sample Product"
}
  • 属性命名策略Id 被序列化为 idName 被序列化为 name,符合 camelCase 命名惯例。

  • 忽略默认值Price 属性的默认值为 0.0Description 属性的默认值为 null,因此在序列化结果中被省略。

以上是对.NET 9中JSON序列化部分的研究、分享和介绍。

周国庆

2024/12/22

.NET 9 New features-JSON序列化的更多相关文章

  1. Play中JSON序列化

    总的来说在scala体系下,对于习惯了java和c#这些常规开发的人来说,无论是akka-http还是play,就处理个json序列化与反序列化真他娘够费劲的. 根据经验,Json处理是比较简单的,但 ...

  2. Json序列化指定输出字段 忽略属性

    DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...

  3. .Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  4. Newtonsoft.Json 序列化和反序列化 时间格式【转】

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  5. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  6. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  7. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  8. 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

    ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...

  9. Windows Phone 六、JSON序列化

    JSON序列化 public class Person { public int Id { get; set; } public string Name { get; set; } public in ...

  10. [MVC_Json序列化]MVC之Json序列化循环引用

    在做MVC项目时,难免会遇到Json序列化循环引用的问题,大致错误如下 错误1:序列化类型为“...”的对象时检测到循环引用. 错误2:Self referencing loop detected f ...

随机推荐

  1. Trace32 simulator调试以及简单实用命令介绍

    目录 Trace32 Simulator debug Trace32工具配置 Trace32命令简介 memory class 常见命令索引 v.v使用实例 不同CPU运行信息查看 Trace32 S ...

  2. Java日期时间API系列32-----Jdk8中java.time包中的新的日期时间API类应用,时间工具包 xk-time 1.0.0 版本完成。

    从Java日期时间API系列第一篇博客开始,利用业余时间对Java日期时间API源码进行了系统的.多次的阅读实践,包括Date.LocalDate.LocalDateTime.LocalTime.In ...

  3. 墨天轮访谈 | 华为云温云博:从客户视角出发,GaussDB(for Redis)究竟“香”在哪里?

    分享嘉宾:温云博 华为云数据库NoSQL团队研发工程师 整理:墨天轮社区 导读 GaussDB(for Redis)采用云原生分布式架构,完全兼容Redis协议,支持丰富数据类型. 提供数据实时持久化 ...

  4. 银河麒麟、中标麒麟学习实操资料汇总(含V4、V7、V10)

    数据库和操作系统关系十分密切,因为数据库是运行于操作系统上的一个管理数据的应用.在数据库国产化替代的浪潮之下,一批批国产操作系统也崭露头角.墨天轮社区便选取了中国操作系统排行榜上排名靠前的麒麟软件,依 ...

  5. 静态库封装之ComStr类

    ComStr.h #pragma once #include <string> #include <vector> using namespace std; class Com ...

  6. kotlin关键字与操作符

    硬关键字:始终解释为关键字,不能用作标识符 as - 用于类型转换 - 为导入指定一个别名 as? 用于安全类型转换 break 终止循环的执行 class 声明一个类 continue 继续最近层循 ...

  7. 题解:AT_abc374_d [ABC374D] Laser Marking

    题目传送门 luogu观看 思路 注意一下数据范围. \(1 \le n \le 6\) 首先想到 dfs. 按照题意,先算出位置到线段的一段所需的时间. 再算出画线段所需的时间,就行了. 输出后发现 ...

  8. 比较var和let的区别

    什么是作用域 块级作用域:即在{}花括号内的域,由{ }包括,比如if{}块.for(){}块.注意函数快也叫做块 函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的. JS ...

  9. JS 数组转对象 对象转数组 对象数组互相转换 数组对象互相转换

    JS 数组转对象 对象转数组  对象数组互相转换  数组对象互相转换 声明一个函数,arr_obj ,里面接收一个参数,参数类型只接受对象或者数组 如果没有传递任何参数  或者 传递的参数类型不符合要 ...

  10. C++ 迪利克雷(Dirichlet)分布

    遇到一个要使用 dirichlet 分布的情形,发现 C++ 标准库中没有现成的.查阅维基百科发现,虽然它挺复杂,但是它跟 Gamma 分布有如下关系: 设有 K 个相互独立且分别满足 Gamma 分 ...