Newtonsoft反序列化DataSet时首项日期为null引发格式解析错误
问题根源
- Newtonsoft.Json反序列化DataSet时,默认会根据数组第一个对象的字段值推断DataTable的列类型和日期解析格式,首个对象的日期字段为null时,无法正确匹配到你需要的
dd-mm-yyyy格式规则,会回退到系统默认的mm-dd-yyyy日期格式解析后续值,就会出现日期错位、无效日期的问题。 - 你示例中的日期同时包含ISO 8601带T的时间戳格式,默认解析逻辑也可能和预期规则冲突。
解决方案
方法1:显式指定序列化配置(最常用)
反序列化时传入自定义配置,固定日期解析规则,关闭自动推断逻辑:
var jsonSettings = new JsonSerializerSettings { // 按需指定支持的日期格式,可同时配置多个适配不同场景 DateFormatString = "dd-MM-yyyy", // 适配示例中ISO时间格式写法: // DateFormatString = new[] { "dd-MM-yyyy", "yyyy-MM-ddTHH:mm:ss" }, DateParseHandling = DateParseHandling.DateTime, NullValueHandling = NullValueHandling.Ignore }; // 反序列化时传入配置 pDs = JsonConvert.DeserializeObject<DataSet>(json, jsonSettings);
方法2:自定义日期转换器(兼容多格式场景)
如果日期格式不统一,可以自定义转换器统一处理解析逻辑,同时适配DataSet的null值规则:
public class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { // 按优先级配置所有需要支持的日期格式 DateTimeFormats = new[] { "dd-MM-yyyy", "yyyy-MM-ddTHH:mm:ss" }; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 处理null值适配DataSet字段规则 if (reader.Value == null) return DBNull.Value; return base.ReadJson(reader, objectType, existingValue, serializer); } }
使用时将转换器加入配置即可:
var jsonSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new CustomDateTimeConverter() }, DateParseHandling = DateParseHandling.DateTime }; pDs = JsonConvert.DeserializeObject<DataSet>(json, jsonSettings);
方法3:提前定义DataSet结构(最稳妥)
如果JSON结构固定,可手动提前定义DataSet、DataTable的列结构,明确指定日期字段类型,完全避免自动推断带来的问题:
// 预定义结构 DataSet pDs = new DataSet(); DataTable dadosTable = new DataTable("dados"); // 明确添加所有列,日期列指定为DateTime类型 dadosTable.Columns.Add("dt_inicio", typeof(DateTime)); dadosTable.Columns.Add("dt_fim", typeof(DateTime)); dadosTable.Columns.Add("dt_envio_hardware", typeof(DateTime)); // 其余字段按需添加... pDs.Tables.Add(dadosTable); // 用PopulateObject把JSON内容填充到已有结构中 JsonConvert.PopulateObject(json, pDs, jsonSettings);
内容的提问来源于stack exchange,提问作者Giovane Winck
相关产品推荐
相关产品推荐

