c# json序列化和反序列化 newtonsoft.json
#技术教程 发布时间: 2026-01-14
JsonConvert.SerializeObject 默认用 JavaScriptDateTimeConverter 输出 "/Date(1234567890000)/" 格式,因 ASP.NET WebForms 遗留;应设 DateFormatHandling.IsoDateFormat 并注意 ToUniversalTime()。
为什么 JsonConvert.SerializeObject 会把 DateTime 转成带斜杠的字符串而不是 ISO 8601?
Newtonsoft.Json 默认用 JavaScriptDateTimeConverter,它把 DateTime 序列化为 
"/Date(1234567890000)/" 格式——这是早期 ASP.NET WebForms 的遗留行为,现代 API 基本不认这个。
-
解决方法:全局配置
JsonSerializerSettings,显式指定DateFormatHandling = DateFormatHandling.IsoDateFormat - 或者单次调用时传入设置:
JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat }); - 注意:如果服务端要求 UTC 时间,别忘了在序列化前调用
.ToUniversalTime(),否则本地时区时间会被当成 UTC 写入
反序列化时遇到 "Cannot deserialize the current JSON array" 错误
这个错误通常不是因为 JSON 格式错,而是类型不匹配。比如你传入的是 JSON 数组 [{"id":1},{"id":2}],但代码里写了 JsonConvert.DeserializeObject(期望单个对象)。
- 检查 JSON 开头是
[还是{:数组对应List或T[],对象对应T - 不要靠猜测类型,用
JToken.Parse(json).Type先确认结构:var token = JToken.Parse(json);
Console.WriteLine(token.Type); // 输出 Array 或 Object - 如果 JSON 结构不确定(比如可能单个或多个),先反序列化为
JToken,再分支处理
如何忽略某个属性不参与序列化?
最常用的是 [JsonIgnore] 特性,但它只对 public 属性/字段生效。如果字段是 private 或需要运行时判断是否忽略,就得换方式。
- 静态忽略:在属性上加
[JsonIgnore],简单直接public class User {
public string Name { get; set; }
[JsonIgnore]
public string Password { get; set; }
} - 动态忽略:用
ShouldSerialize{PropertyName}()方法(命名必须严格匹配),返回false就跳过public bool ShouldSerializePassword() => !IsAdmin;
- 注意:
[JsonIgnore]对private set字段无效;若需控制私有字段,改用JsonPropertyAttribute+DefaultValueHandling.Ignore配合DefaultValue
使用 JsonConvert.DeserializeObject 时泛型类型 T 为空或 null 怎么办?
这不是 Newtonsoft 的 bug,而是 C# 泛型擦除机制导致:运行时无法获取 T 的完整类型信息,尤其当 T 是接口(如 IList)或抽象类时,反序列化会失败并抛出 JsonSerializationException。
- 接口/抽象类必须配合
TypeNameHandling才能还原具体类型,但开启它有安全风险(反序列化任意类型),不推荐用于不可信输入 - 更稳妥的做法:用具体类型反序列化,例如把
IList改成List - 如果必须用接口且来源可信,可临时启用:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
JsonConvert.DeserializeObject>(json, settings);
真正容易被忽略的是:即使类型写对了,如果 JSON 中字段名和 C# 属性名大小写不一致(比如 JSON 是 user_name,C# 是 UserName),默认不会自动映射——得加 [JsonProperty("user_name")] 或统一设 ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() }。
上一篇 : AI写作工具终极测评:提升效率,优化内容
下一篇 : Achievers Desk: 免费在线生成多语言条款及条件
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!