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用于所有后续处理

我相信肯定有比这更好的方法,但我不知道它是什么。有人能提出更好的解决方案吗?

JsonConvert.SerializeObject到具有不可为null的DateTime属性的类

使用适当的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; }