

新闻资讯
技术教程JsonConvert.SerializeObject 默认用 JavaScriptDateTimeConverter 输出 "/Date(1234567890000)/" 格式,因 ASP.NET WebForms 遗留;应设 DateFormatHandling.IsoDateFormat 并注意 ToUniversalTime()。
Newtonsoft.Json 默认用 JavaScriptDateTimeConverter,它把 DateTime 序列化为 "/Date(1234567890000)/" 格式——这是早期 ASP.NET WebForms 的遗留行为,现代 API 基本不认这个。
JsonSerializerSettings,显式指定 DateFormatHandling = DateFormatHandling.IsoDateFormat
JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat });.ToUniversalTime(),否则本地时区时间会被当成 UTC 写入这个错误通常不是因为 JSON 格式错,而是类型不匹配。比如你传入的是 JSON 数组 [{"id":1},{"id":2}],但代码里写了 JsonConvert.DeserializeObject(期望单个对象)。
[ 还是 {:数组对应 List 或 T[],对象对应 T
JToken.Parse(json).Type 先确认结构:var token = JToken.Parse(json);
Console.WriteLine(token.Type); // 输出 Array 或 Object
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 + D
efaultValueHandling.Ignore 配合 DefaultValue
这不是 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() }。