架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 941|回复: 5

[技巧] 关于 System.Text.Json 操作 JSON 的一些技巧

[复制链接]
发表于 2024-11-25 08:39:50 | 显示全部楼层 |阅读模式
在 .NET Core 3.1 版本之前,我们对对象序列化和反序列化,通过需要引用第三方包,例如:Newtonsoft.Json,现在 .NET 已经自带对 JSON 操作的支持。System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。 System.Text.Json 库包含在 .NET Core 3.1 和更高版本的运行时中。

JsonSerializerOptions 线程安全

如果你通过相同的选项重复使用 JsonSerializerOptions,则请勿在每次使用时都创建新的 JsonSerializerOptions 实例。 对每个调用重复使用同一实例。 本指南适用于你为自定义转换器编写的代码,以及调用 JsonSerializer.Serialize 或 JsonSerializer.Deserialize时。 在多个线程中使用相同的实例是安全的。 选项实例上的元数据缓存是线程安全的,并且实例在第一次序列化或反序列化之后不可变。

参考:https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/configure-options

序列化和反序列化

代码如下:

QQ截图20241125082644.jpg

使用 ASP.NET Core 中 JSON 配置

如果想使用 ASP.NET Core 中的 JSON 全局配置,可以在构造函数注入如下:

使用 Web 版配置方案

JsonSerializerDefaults 枚举指定可用于构造 JsonSerializerOptions 实例的基于方案的默认序列化选项。

代码如下:

QQ截图20241125083821.jpg
QQ截图20241125083900.jpg

参考:https://learn.microsoft.com/zh-cn/dotnet/api/system.text.json.jsonserializerdefaults?view=net-8.0





上一篇:Windows 服务器 {xxx} 没有在要求的超时时间内向 DCOM 注册。
下一篇:前端网页 3 种方式执行 wasm 内函数
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-12-18 19:07:36 | 显示全部楼层
使用 JsonNode 读取 JSON 字符串某个值

有时候,我们可能只需要读取 JSON 字符串里面某个值就行,新建一个对象,再反序列化成此对象比较麻烦,可以直接使用 JsonNode 读取 JSON 字符串某个值,代码如下:

QQ截图20241218190719.jpg

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-12-30 13:29:28 | 显示全部楼层
序列化为 UTF-8 字节数组(Utf8Bytes)

序列化为 UTF-8 字节数组比使用基于字符串的方法快 5-10%。这是因为字节(UTF-8)不需要转换为字符串(UTF-16)。

要序列化为 UTF-8 字节数组,请调用JsonSerializer.SerializeToUtf8Bytes方法:


https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/how-to
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2025-1-2 09:04:00 | 显示全部楼层
使用 System.Text.Json 移除字符串为 null 或者 "" 的数据,将 json 字符串反序列化成 object 对象,如果有几百个字段,很多都是记录为 null,为了节省传输,可以将这些字段移除。System.Text.Json 会将 json 字符串反序列化成 System.Text.Json.JsonElement。

QQ截图20250102085935.jpg

代码如下:



JsonObject 不尊重 JsonIgnoreCondition.WhenWritingNull:https://github.com/dotnet/runtime/issues/54184
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2025-2-18 13:53:03 | 显示全部楼层
使用 JsonObject 直接创建对象,并且序列化成 json 字符串,如下图:

屏幕截图 2025-02-18 135140.jpg

代码:

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2025-2-28 09:17:31 | 显示全部楼层
通过 [JsonPropertyName] 属性来自定义字段的序列化名称



QQ截图20250228091722.jpg
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-5-25 18:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表