JsonConvert.SerializeObject到具有不可为null的DateTime属性的类
本文关键字:null DateTime 属性 SerializeObject JsonConvert | 更新日期: 2023-09-27 18:06:48
背景
我有一些JSON,它被反序列化为具有DateTime
属性的类。
有时CCD_ 2的对应元素是CCD_。
当您尝试将JSON
反序列化为类时,会引发一个错误,因为普通的旧DateTime
无法接受null
。
简单但删除了功能
因此,最简单的解决方案是使类的可接受属性成为可为null的DateTime
(DateTime?
(,但如果这样做,那么就有很多DateTime
方法不能再用于这些属性。
有效,但。。。奇怪吗
因此,在寻找替代方案时,我考虑了以下内容:
public class FooRelaxed
{
[Required(ErrorMessage = "Please enter the id.")]
public int? Id { get; set; }
[Required(ErrorMessage = "Please enter the Start Date.")]
public DateTime? StartDate { get; set; }
[Required(ErrorMessage = "Please enter the End Date.")]
public DateTime? EndDate { get; set; }
public FooRelaxed() { }
public FooRelaxed(
int? id,
DateTime? startdate,
DateTime? enddate)
{
this.Id = id;
this.EndDate = enddate;
this.StartDate = startdate;
}
}
public class FooStrict
[Required(ErrorMessage = "Please enter the id.")]
public int Id { get; set; }
[Required(ErrorMessage = "Please enter the Start Date.")]
public DateTime StartDate { get; set; }
[Required(ErrorMessage = "Please enter the End Date.")]
public DateTime EndDate { get; set; }
public FooStrict() { }
public FooStrict(FooRelaxed obj)
{
this.Id = Convert.ToInt32(obj.Id);
this.EndDate = Convert.ToDateTime(obj.EndDate);
this.StartDate = Convert.ToDateTime(obj.StartDate);
}
}
然后我使用这些类:
- 将
JSON
反序列化为FooRelaxed类,该类具有可为null的DateTime
属性 - 通过对结果对象调用
Validator.TryValidateObject
来验证其属性 - 假设没有错误,则实例化"shadow"类FooStrict,该类具有不可为null的
DateTime
属性,使用FooRexraxed实例作为构造函数的参数 - 将FooStrict用于所有后续处理
我相信肯定有比这更好的方法,但我不知道它是什么。有人能提出更好的解决方案吗?
使用适当的JsonProperty
属性进行装饰:
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
或
[JsonProperty("<NameOfProperty>", NullValueHandling=NullValueHandling.Ignore)]
最终代码为:
[JsonProperty("EndDate", NullValueHandling=NullValueHandling.Ignore)]
public DateTime EndDate { get; set; }
[JsonProperty("StartDate", NullValueHandling=NullValueHandling.Ignore)]
public DateTime StartDate { get; set; }