0

0

C#操作JSON文件 C#如何读取和写入JSON数据

煙雲

煙雲

发布时间:2026-03-06 06:07:21

|

722人浏览过

|

来源于php中文网

原创

system.text.json 是 .net core 3.0+ 和 .net 5+ 读写 json 的首选方案,性能优、内存省;需注意类型匹配、大小写一致、空值处理、路径创建、原子写入、datetimezonehandling 及大文件用 jsondocument。

c#操作json文件 c#如何读取和写入json数据

System.Text.Json 读取 JSON 文件最稳妥

.NET Core 3.0+ 和 .NET 5+ 默认推荐用 System.Text.Json,性能好、内存占用低,且无需额外 NuGet 包。直接调用 JsonSerializer.Deserialize<t>()</t> 即可,但要注意类型必须匹配,否则抛 JsonException

常见错误现象:JsonException: The JSON value could not be converted to XXX,通常是因为 JSON 字段名大小写不一致、字段缺失或类型错配(比如 JSON 里是字符串,C# 类型却是 int)。

  • 确保目标类的属性名与 JSON 字段名一致,或用 [JsonPropertyName("xxx")] 显式标注
  • 对可能为空的字段,用可空类型(如 int?string)或设置 JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
  • 读取失败时先用 File.ReadAllText(path) 打印原始 JSON,确认结构是否符合预期

写入 JSON 文件时别漏掉 JsonSerializerOptions.WriteIndented

默认序列化结果是紧凑格式(无换行缩进),不利于人工查看和调试。启用美化输出只需一行配置:

var options = new JsonSerializerOptions { WriteIndented = true };

但要注意:开启 WriteIndented 会略微增加 CPU 和内存开销,高频写入日志类场景建议关闭;而配置文件、调试导出等场景强烈建议打开。

NetShop网店系统
NetShop网店系统

NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces

下载
  • 写入前检查对象是否为 null,否则 Serialize 会返回空字符串而非报错
  • 路径不存在时 File.WriteAllText 不会自动创建目录,需提前调用 Directory.CreateDirectory(Path.GetDirectoryName(path))
  • 避免直接覆盖正在被其他进程读取的 JSON 配置文件,可先写临时文件再原子替换

遇到日期格式混乱就改 DateTimeZoneHandling

C# 的 DateTime 默认序列化为 ISO 8601 格式(如 "2024-05-20T09:30:00"),但时区信息容易丢失或误判。如果 JSON 来源是 JavaScript 或其他语言,常出现 "\/Date(1234567890000)\/" 这类格式,System.Text.Json 默认不支持解析。

  • 统一用 DateTimeOffset 替代 DateTime 可保留时区偏移
  • 需要兼容旧格式?得手动预处理字符串,或换用 Newtonsoft.Json(它内置 DateTimeZoneHandling 枚举)
  • 序列化时控制格式:通过 JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()) 等扩展转换器

小文件用 Deserialize<t></t>,大文件或流式场景用 JsonDocument

如果 JSON 文件超过几 MB,或者你只关心其中某几个字段(比如只取 "users[0].name"),全量反序列化成对象会浪费内存。这时该用 JsonDocument.Parse() 解析为只读 DOM 树,按需提取值:

using var doc = JsonDocument.Parse(jsonString);
var name = doc.RootElement.GetProperty("name").GetString();

注意:JsonDocument 必须显式释放(用 using),否则可能引发内存泄漏;它不支持修改,纯读取场景才适用。

  • 无法直接映射到泛型类,适合结构动态、字段不确定的配置解析
  • 嵌套深、层级多时,链式调用 GetProperty() 容易触发 KeyNotFoundException,务必用 TryGetProperty()
  • 从文件读取时,优先用 JsonDocument.Parse(File.OpenRead(path)) 避免一次性加载全部内容到内存

实际项目中,多数配置类场景用 System.Text.Json + 强类型反序列化足够;但只要涉及 JS 互通、复杂日期、或超大 JSON,就得在序列化选项、类型选择和异常兜底上多留一层判断。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

452

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1029

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号