ASP.NET Web API 2中移除DateTime的T字符及优化Null值显示咨询
ASP.NET Web API 2 日期格式化与Null值处理方案
一、先修正数据读取的潜在问题
你的原代码存在两个明显问题:
UserId在返回结果中是字符串类型(如ABC001),但代码里用Convert.ToInt32转换,会直接抛出异常,需改为字符串类型处理。- 数据库中
Date和Access存在Null值,直接用Convert.ToDateTime/Convert.ToInt32会报错,需将实体类对应字段改为可空类型,并添加Null判断。
修正后的实体类
public class TestClass { public string UserId { get; set; } public string Name { get; set; } public string Mobile { get; set; } public int? Access { get; set; } // 改为可空int类型 public DateTime? Date { get; set; } // 改为可空DateTime类型 }
修正后的数据读取逻辑
while (sdr.Read()) { draft.Add(new TestClass() { UserId = sdr.IsDBNull(0) ? null : sdr.GetString(0), Name = sdr.IsDBNull(1) ? string.Empty : sdr.GetString(1), Mobile = sdr.IsDBNull(2) ? string.Empty : sdr.GetString(2), Access = sdr.IsDBNull(3) ? (int?)null : sdr.GetInt32(3), Date = sdr.IsDBNull(4) ? (DateTime?)null : sdr.GetDateTime(4) }); }
二、移除DateTime中的T字符
Web API默认XML序列化会输出ISO8601格式的日期(带T分隔符),以下两种方法可自定义日期格式:
方法1:通过DataContractSerializer配置日期格式
给实体类添加DataContract和DataMember特性,指定日期格式:
using System.Runtime.Serialization; [DataContract] public class TestClass { [DataMember] public string UserId { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Mobile { get; set; } [DataMember(EmitDefaultValue = false)] public int? Access { get; set; } [DataMember(EmitDefaultValue = false)] [DataFormat(DataFormatString = "yyyy-MM-dd HH:mm:ss")] public DateTime? Date { get; set; } }
然后在WebApiConfig.cs中配置使用DataContractSerializer:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var xmlFormatter = config.Formatters.XmlFormatter; xmlFormatter.UseXmlSerializer = false; // 启用DataContractSerializer xmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml")); } }
方法2:自定义XmlTextWriter处理日期格式
如果偏好使用XmlSerializer,可创建自定义写入器替换T为空格:
public class CustomXmlTextWriter : System.Xml.XmlTextWriter { public CustomXmlTextWriter(System.IO.TextWriter writer) : base(writer) { } public override void WriteString(string text) { if (System.DateTime.TryParse(text, out System.DateTime date)) { base.WriteString(date.ToString("yyyy-MM-dd HH:mm:ss")); } else { base.WriteString(text); } } }
在WebApiConfig.cs中配置格式化器:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var xmlFormatter = config.Formatters.XmlFormatter; xmlFormatter.SetSerializer<TestClass>(new System.Xml.Serialization.XmlSerializer(typeof(TestClass))); xmlFormatter.CreateXmlWriter = (stream, encoding) => new CustomXmlTextWriter(new System.IO.StreamWriter(stream, encoding)); } }
三、优化Null值的显示格式
根据你的需求,提供两种实现方式:
选项1:显示为空标签(return (<Date></Date>)
)
return (<Date></Date>)将实体类中Date和Access改为字符串类型,读取数据时直接转换为字符串或空值:
public class TestClass { public string UserId { get; set; } public string Name { get; set; } public string Mobile { get; set; } public string Access { get; set; } public string Date { get; set; } }
读取逻辑调整:
while (sdr.Read()) { draft.Add(new TestClass() { UserId = sdr.IsDBNull(0) ? null : sdr.GetString(0), Name = sdr.IsDBNull(1) ? string.Empty : sdr.GetString(1), Mobile = sdr.IsDBNull(2) ? string.Empty : sdr.GetString(2), Access = sdr.IsDBNull(3) ? string.Empty : sdr.GetInt32(3).ToString(), Date = sdr.IsDBNull(4) ? string.Empty : sdr.GetDateTime(4).ToString("yyyy-MM-dd HH:mm:ss") }); }
选项2:显示为return (<Date>null</Date>)
return (<Date>null</Date>)同样将字段改为字符串类型,读取时给Null值赋值"null":
Date = sdr.IsDBNull(4) ? "null" : sdr.GetDateTime(4).ToString("yyyy-MM-dd HH:mm:ss"); Access = sdr.IsDBNull(3) ? "null" : sdr.GetInt32(3).ToString();
如果要保留可空值类型,可结合之前的自定义CustomXmlTextWriter,修改写入逻辑:
public override void WriteString(string text) { if (string.IsNullOrEmpty(text) || text == "null") { base.WriteString("null"); } else if (System.DateTime.TryParse(text, out System.DateTime date)) { base.WriteString(date.ToString("yyyy-MM-dd HH:mm:ss")); } else { base.WriteString(text); } }
同时给实体类属性添加XmlElement(IsNullable = true)特性:
using System.Xml.Serialization; public class TestClass { public string UserId { get; set; } public string Name { get; set; } public string Mobile { get; set; } [XmlElement(IsNullable = true)] public int? Access { get; set; } [XmlElement(IsNullable = true)] public DateTime? Date { get; set; } }
内容的提问来源于stack exchange,提问作者user27429245
相关产品推荐
相关产品推荐

