ASP.NET Web API:禁用ISO 8601格式字符串的自动格式化
解决ASP.NET Web API中禁用ISO 8601日期自动格式化的问题
刚好之前处理过类似的场景,在ASP.NET Web API里要控制JSON日期的序列化/反序列化行为,主要分**序列化(对象转JSON)和反序列化(JSON转对象)**两种场景来解决你的需求:
1. 阻止DateTime类型字段自动生成ISO格式(序列化场景)
你的模型里CreatedDate和LastUpdated.Date是DateTime类型,Web API默认会把它们序列化为ISO 8601格式的字符串。要禁用这个自动行为,有两种方式:
全局配置(影响整个API)
在项目的WebApiConfig.cs文件的Register方法中,修改Json序列化器的设置:
public static void Register(HttpConfiguration config) { // 保留原有的路由等配置... // 获取Json序列化设置对象 var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; // 方案1:改用微软传统的日期格式(如"/Date(1620000000000)/") jsonSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat; // 方案2:自定义日期格式(比如你想要的"yyyy-MM-dd HH:mm:ss") // jsonSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; }
单个字段配置(仅影响特定DateTime字段)
如果只需要针对个别字段调整格式,不用全局修改,可以给字段添加[JsonProperty]特性指定格式:
public class MemberModel { public string MemberId { get; set; } public Dictionary<string, string> Data { get; set; } // 自定义CreatedDate的序列化格式,替代默认的ISO 8601 [JsonProperty(DateFormatString = "yyyy-MM-dd HH:mm:ss")] public DateTime CreatedDate { get; set; } public LastUpdatedInfo LastUpdated { get; set; } } public class LastUpdatedInfo { [JsonProperty(DateFormatString = "yyyy-MM-dd HH:mm:ss")] public DateTime Date { get; set; } }
2. 阻止Dictionary中日期字符串被自动解析为DateTime(反序列化场景)
你的Data字段是Dictionary<string, string>,默认情况下Json.NET会自动识别ISO格式的字符串并将其解析为DateTime对象,但你需要保留它们的原始字符串类型。解决方式如下:
全局配置(所有字符串日期都保留为string)
同样在WebApiConfig.cs的Register方法中添加配置:
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; // 禁用自动解析日期字符串,所有日期格式的字符串都会保留为string类型 jsonSettings.DateParseHandling = DateParseHandling.None;
针对单个Dictionary字段配置(仅影响Data字段)
如果不想全局禁用日期解析,只想针对Data字段处理,可以自定义一个Json转换器:
public class StringDictionaryConverter : JsonConverter<Dictionary<string, string>> { public override Dictionary<string, string> ReadJson(JsonReader reader, Type objectType, Dictionary<string, string> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 强制将所有值读取为原始字符串,不进行日期解析 var jObject = JObject.Load(reader); var resultDict = new Dictionary<string, string>(); foreach (var prop in jObject.Properties()) { resultDict[prop.Name] = prop.Value.ToString(); } return resultDict; } public override void WriteJson(JsonWriter writer, Dictionary<string, string> value, JsonSerializer serializer) { // 序列化时按正常逻辑处理即可 serializer.Serialize(writer, value); } }
然后给模型的Data字段添加转换器特性:
public class MemberModel { public string MemberId { get; set; } // 指定自定义转换器,确保Data中的值都保留为string [JsonConverter(typeof(StringDictionaryConverter))] public Dictionary<string, string> Data { get; set; } public DateTime CreatedDate { get; set; } public LastUpdatedInfo LastUpdated { get; set; } }
总结
- 如果你是要序列化时避免DateTime生成ISO格式:选全局配置修改日期格式,或者给单个字段加特性。
- 如果你是要反序列化时保留Data中的日期字符串不被解析:选全局禁用日期解析,或者给Data字段加自定义转换器。
内容的提问来源于stack exchange,提问作者jorgen
相关产品推荐
相关产品推荐

