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

.NET 7中让Newtonsoft.Json对空字符串DateTime抛异常而非转null

解决Newtonsoft.Json DateTime?字段的空字符串与null值处理需求

针对.NET 7环境下使用Newtonsoft.Json 13.0.2的需求,可通过自定义JsonConverter实现精准控制:

自定义DateTime?转换器

创建继承自JsonConverter<DateTime?>的转换器类,在读取JSON时做针对性判断:

public class StrictNullableDateTimeConverter : JsonConverter<DateTime?>
{
    public override DateTime? ReadJson(JsonReader reader, Type objectType, DateTime? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            // 遇到null值直接返回null,不触发异常
            return null;
        }
        else if (reader.TokenType == JsonToken.String)
        {
            var strValue = reader.Value.ToString();
            if (string.IsNullOrEmpty(strValue))
            {
                // 空字符串直接抛出序列化异常
                throw new JsonSerializationException("DateTime?字段不允许传入空字符串");
            }
            // 正常解析非空字符串为DateTime类型
            return DateTime.Parse(strValue);
        }
        // 其他类型按默认逻辑处理
        return serializer.Deserialize<DateTime?>(reader);
    }

    public override void WriteJson(JsonWriter writer, DateTime? value, JsonSerializer serializer)
    {
        // 序列化阶段按默认逻辑执行即可
        serializer.Serialize(writer, value);
    }
}

转换器的两种使用方式

方式一:字段/属性级单独标记

在需要严格校验的DateTime?字段或属性上添加特性:

public class TestModel
{
    [JsonConverter(typeof(StrictNullableDateTimeConverter))]
    public DateTime? DateTimeNull { get; set; }
}

方式二:全局配置生效

如果希望所有DateTime?字段都应用该规则,可在序列化配置中全局注册:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new StrictNullableDateTimeConverter());

// 测试空字符串Payload
var emptyStringPayload = "{\"DateTimeNull\":\"\"}";
try
{
    JsonConvert.DeserializeObject<TestModel>(emptyStringPayload, settings);
}
catch (JsonSerializationException ex)
{
    // 捕获到预期的异常
    Console.WriteLine(ex.Message);
}

// 测试null值Payload
var nullPayload = "{\"DateTimeNull\":null}";
var model = JsonConvert.DeserializeObject<TestModel>(nullPayload, settings);
// model.DateTimeNull 会被正确解析为null,无异常

以上实现完全满足需求:空字符串触发异常,null值正常解析为null。

内容的提问来源于stack exchange,提问作者dotnetstep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:13:30