C#如何解析JSON数据_C#使用Newtonsoft.Json序列化对象【干货】

云涛君_7019

云涛君_7019

2026-04-26

479人浏览

原创

jsonconvert.deserializeobject() 易出错因默认行为与直觉不符:大小写敏感、null 静默转默认值、非iso日期变minvalue、注释致异常;嵌套失败多因字段名/类型不匹配;动态解析掩盖拼写错误,新项目应优先用 system.text.json。

c#如何解析json数据_c#使用newtonsoft.json序列化对象【干货】

直接用 JsonConvert.DeserializeObject<t>()</t> 是最常用也最容易出错的方式——不是它不行,而是默认行为和你直觉不一致的地方太多,尤其从 Newtonsoft.Json 切过来的人,常在大小写、null 处理、日期格式上栽跟头。

为什么 JsonConvert.DeserializeObject 会静默失败或抛异常

Newtonsoft 默认宽容,但“宽容”不等于“鲁棒”。它会在很多边界情况里做隐式转换,反而掩盖问题:

  • JsonConvert.DeserializeObject<person>(json)</person> 遇到 "age": null 时,会把 int Age 设为 0,而不是报错——但这个 0 很可能不是业务意图
  • JSON 字段是 "user_name",C# 属性叫 UserName,不加 [JsonProperty("user_name")] 就读不到,也不会警告
  • 遇到 "created_at": "2024/03/15" 这种非 ISO 格式日期,DateTime 属性会反序列化为 DateTime.MinValue,且不抛异常
  • 如果 JSON 里有注释(比如调试时手动加的 // note),默认直接报 JsonReaderException

解析多层嵌套 JSON 时怎么避免属性全为 null

嵌套结构崩掉,90% 是字段名没对齐或类型不兼容。别靠猜,用这几招定位:

  • 先用 JObject.Parse(json) 把整个 JSON 加载成动态对象,再逐层检查:obj["data"]?["items"]?[0]?["id"] —— 这样能快速确认哪一层开始缺失
  • 确保每一层嵌套类都定义了,且集合字段声明为 public List<item> Items { get; set; }</item>,而不是 Item[] 或 IEnumerable<item></item>(后者反序列化可能失败)
  • 对可选字段,C# 属性必须显式支持 null:用 string?、int?、DateTimeOffset?,而不是 string 或 DateTime
  • 如果 JSON 中数字有时是字符串(如 "count": "5"),加配置:new JsonSerializerSettings { NumberHandling = NumberHandling.AllowLeadingAndTrailingWhitespace | NumberHandling.AllowHexSpecifier }

什么时候该放弃强类型,改用 JObject 或 JArray

不是所有 JSON 都适合套类。以下场景硬套 DeserializeObject<t></t> 只会拖慢开发、增加崩溃风险:

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
  • 第三方 API 返回的 data 字段是黑盒结构,字段名带时间戳(如 "metric_2024_q3")、或根据 "type" 动态切换内容("type": "user" → 解成 UserDto,"type": "order" → 解成 OrderDto)
  • 只取日志 JSON 中的 "error.code" 和 "trace_id" 两个字段,其余几十个字段完全无关
  • JSON 数组里混着不同类型:[{"type":"msg","text":"ok"},{"type":"err","code":500}],没法用单一泛型集合承载
  • 需要运行时修改字段值再序列化回去(比如打日志前脱敏 obj["user"]["phone"] = "***")

这时候用 JObject.Parse(json) + obj["path"].ToString() 或 (string)obj["path"] 更直接,也更安全。

Newtonsoft.Json 还值得留吗?关键看三点

不是“能不能用”,而是“值不值得为它多扛一个包、多维护一套行为逻辑”:

  • 如果你项目已大量使用 JToken 做条件分支解析(比如根据 token["kind"].ToString() 决定后续路径),迁移成本高,可以暂留
  • 如果你依赖 TypeNameHandling.Auto 反序列化多态类型(比如 "$type": "MyApp.User, MyApp"),System.Text.Json 目前仍需手写 JsonConverter,Newtonsoft 更省事
  • 但新项目、新接口、新 DTO 类型,别再引入它——.NET 6+ 的 System.Text.Json 在性能、内存、UTF-8 支持上全面占优,且 PropertyNameCaseInsensitive、NumberHandling 等开关已补全关键能力

真正容易被忽略的是:Newtonsoft 的 dynamic 解析(比如 var obj = JsonConvert.DeserializeObject<dynamic>(json)</dynamic>)看着方便,实际会让字段拼写错误在运行时才暴露,IDE 不提示、编译不报错、测试难覆盖。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

952

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

2711

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

865

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2615

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

312

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

389

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

611

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

309

20

热门下载

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

精品课程

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

共101课时 | 20.9万人学习

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

共39课时 | 4.8万人学习