.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
相关产品推荐
相关产品推荐

