You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:09:03