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

时间:2016-09-13 04:52:13

标签: c# asp.net json data-annotations

背景

我有一些JSON被反序列化为具有DateTime属性的类。

有时,JSON的相应元素为null

当您尝试将JSON反序列化到该类时,会引发错误,因为普通的DateTime无法接受null

简单但删除功能

因此,最简单的解决方案是使类的接受属性成为可空的DateTimeDateTime?),但如果您这样做,那么很多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,它具有可为空的DateTime属性
  • 通过调用Validator.TryValidateObject来验证结果对象的属性。
  • 假设没有错误,那么实例化阴影' class,FooStrict,它使用FooRexlaxed实例作为构造函数的arg具有不可为空的DateTime属性
  • 将FooStrict用于所有后续处理

我确信必须有比这更好的方法,但我不知道它是什么。任何人都可以提出更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

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