当前位置: 首页 > news >正文

C# System.Text.Json实现高效JSON序列化与反序列化

引言

在.NET生态中,JSON作为主流数据交换格式,其处理效率直接影响应用性能。自.NET Core 3.0引入System.Text.Json以来,开发者拥有了一个高性能、低内存分配的官方JSON解决方案。本文将深入解析其核心功能,助您掌握JSON处理的最佳实践。


一、基础用法快速入门

1.1 简单序列化示例

using System.Text.Json;var person = new Person { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(person);
// 输出:{"Name":"Alice","Age":30}

1.2 反序列化操作

string json = @"{""Name"":""Bob"",""Age"":25}";
Person person = JsonSerializer.Deserialize<Person>(json);

二、高级配置技巧

2.1 自定义序列化选项

var options = new JsonSerializerOptions {PropertyNamingPolicy = JsonNamingPolicy.CamelCase,  // 驼峰命名WriteIndented = true,               // 美化输出IgnoreNullValues = true,            // 忽略空值NumberHandling = JsonNumberHandling.WriteAsString  // 数字序列化为字符串
};

2.2 处理特殊数据类型

日期格式化:

options.Converters.Add(new JsonStringEnumConverter()); // 枚举转字符串
options.DateHandling = JsonDateHandling.ISO8601;        // ISO 8601日期格式

三、性能优化策略

3.1 使用源码生成器(.NET 6+)

[JsonSerializable(typeof(Person))]
public partial class AppJsonContext : JsonSerializerContext {}// 高性能序列化
JsonSerializer.Serialize(person, AppJsonContext.Default.Person);

3.2 内存优化技巧

  • 复用JsonSerializerOptions实例

  • 使用Utf8JsonWriter直接写入流

using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream);
JsonSerializer.Serialize(writer, person);

四、与Newtonsoft.Json对比

特性System.Text.JsonNewtonsoft.Json
性能⭐⭐⭐⭐⭐⭐⭐⭐
内存分配较高
功能丰富度基础功能高度扩展
依赖项.NET内置需安装NuGet包

迁移建议:对性能敏感场景优先使用System.Text.Json,复杂需求可结合两者使用


五、常见问题解决方案

5.1 循环引用处理

options.ReferenceHandler = ReferenceHandler.Preserve;

5.2 字段序列化

options.IncludeFields = true; // 包含公共字段

5.3 忽略属性

public class Person
{[JsonIgnore] // 忽略单个属性public int SecretCode { get; set; }
}

六、最佳实践总结

  1. 生产环境务必配置自定义JsonSerializerOptions

  2. 优先使用异步方法处理大文件

  3. 利用JsonDocument解析未知结构JSON

  4. 定期检查版本更新获取性能优化


结语

通过掌握System.Text.Json的核心用法与优化技巧,开发者可以在.NET应用中实现高效的JSON数据处理。随着.NET版本的迭代,该库将持续增强功能,建议关注官方更新日志获取最新特性。
扩展阅读:微软官方文档

http://www.xdnf.cn/news/309331.html

相关文章:

  • 基于Java多线程实现简单图片下载
  • SLAM算法工程师面经大全:2025年面试真题解析与实战指南
  • 美信监控易:全栈式自主可控的底层架构优势
  • 使用 Poco C++ 库构建轻量级 HTTP 服务器
  • LeetCode 1128. 等价多米诺骨牌对的数量 题解
  • 【了解】通感算一体化网络
  • 深入理解 Web 架构:从基础到实践
  • 【大模型面试每日一题】Day 10:混合精度训练如何加速大模型训练?可能出现什么问题?如何解决?
  • 数据库复习
  • 面试常问系列(一)-神经网络参数初始化-之自注意力机制为什么除以根号d而不是2*根号d或者3*根号d
  • 最新版Google浏览器加载ActiveX控件之VLC五一节特别版
  • Marin说PCB之1000-BASE-T1的PCB设计总结--04
  • DeepSeek:突破AI搜索的无限可能
  • ProteinTools辅助探索蛋白稳定性、动态调控以及结构关系
  • 优化04-选择率和直方图
  • 意识场方程与道函数赋能的三智双融体系建构
  • Xcode16提交App Store审核时提示bitcode报错
  • vue3 computed方法传参数
  • Java泛型深度解析与电商场景应用
  • 手写Promise.all
  • USB接口的PCB设计
  • vue3在使用@import “./index.scss“报错
  • 互联网法院在NFT、元宇宙等新兴领域的规则创新
  • 江苏正力新能Verify认知能力测评笔试已通知 | SHL测评题库预测题 | 华东同舟求职讲求职
  • 园区网的发展
  • Hologres x 函数计算 x Qwen3,对接MCP构建企业级数据分析 Agent
  • 深度可分离卷积(0)
  • Linux 网络编程 day5 多路IO转接之改进select and poll
  • 【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
  • MySQL 触发器(Trigger)讲解