C# 如何处理DateTime的JSON数据成员中的空值

C# 如何处理DateTime的JSON数据成员中的空值,c#,json,json.net,C#,Json,Json.net,我从我的服务接收到一个JSON文件,如下所示: { "body": { "assignedTo": "aa", "message": "aaa", "submittedOn": 1506703098946, "completedOn": null, "submittedBy": "web-user", "completedBy": null, "isSelected": false, "name": "aaa" } } “

我从我的服务接收到一个JSON文件,如下所示:

{
  "body": {
    "assignedTo": "aa",
    "message": "aaa",
    "submittedOn": 1506703098946,
    "completedOn": null,
    "submittedBy": "web-user",
    "completedBy": null,
    "isSelected": false,
    "name": "aaa"
  }
}
“completedOn”的值在我的类中定义为
DateTime
,但我从服务器获得的值为null。有办法处理吗

这是我的班级结构:

[DataContract]
    public class FamilyTask
    {
        private static readonly DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        [DataMember(Name = "Id")]
        public string Id { get; set; }

        [DataMember(Name = "name")]
        public string name { get; set; }

        [DataMember(Name = "assignedTo")]
        public string assignedTo { get; set; }

        [DataMember(Name = "message")]
        public string message { get; set; }

        [DataMember(Name = "submittedBy")]
        public string submittedBy { get; set; }

        [DataMember(Name = "completedBy")]
        public string completedBy { get; set; }

        [IgnoreDataMember]
        public DateTime submittedOn { get; set; }

        [DataMember(Name = "submittedOn")]
        private long submittedOnTicks {
            get { return (long) (submittedOn - unixEpoch).TotalMilliseconds; }
            set { submittedOn = unixEpoch.AddMilliseconds(value); }
        }

        [IgnoreDataMember]
        public DateTime completedOn { get; set; }

        [DataMember(Name = "completedOn")]
        private long completedOnTicks
        {
            get { return (long)(completedOn - unixEpoch).TotalMilliseconds; }
            set { completedOn = unixEpoch.AddMilliseconds(value); }
        }
    }
编辑:

我确实尝试过在
公共日期时间中添加一个可为空的?在{get;set;}
上完成,但这会导致此问题:

编辑2:

我实现了nullable类和null检查,但仍然得到了以下结果:


通过添加问号使其可为空,如下所示:

public DateTime? CompletedOn { get; set;}
然后可以使用.HasValue检查它是否有值。可以使用.value访问实际值

关于编辑,您需要在此处使用.Value(您需要检查null!)

如果Web服务返回日期时间,为什么不这样做呢

[DataMember(Name = "completedOn")]
public DateTime? CompletedOn { get; set;}

// completedOnTicks is not needed anymore?
private long completedOnTicks
{
        get
        { 
             if(CompletedOn.HasValue)
             {
                  return (long)(CompletedOn.Value - unixEpoch).TotalMilliseconds; }
             }

              // CompletedOn is null, return something reasonable
             return long.MinValue;
        }
}

如果它不返回DateTime,而是返回long,只需将long也设置为null。

将其设置为null。是否使用
公共DateTime?completedOn{get;set;}
我确实尝试过将其设置为可空。请看上面。我已经编辑了我的答案。请看我的编辑。我已经按照您的建议实现了nullable和null检查,但是它仍然无法解析。从
completedOnTicks
中删除setter可以很好地解决问题!再次感谢你!最好是使用一个普通的DTO类,然后将DTO映射到一个域对象,我认为最好是删除DateTime?completedOn属性,然后创建了一个long?相反,我选择了completedOn。然后,当您拥有来自web服务的所有数据时,只需将其映射到域对象。
[DataMember(Name = "completedOn")]
public DateTime? CompletedOn { get; set;}

// completedOnTicks is not needed anymore?
private long completedOnTicks
{
        get
        { 
             if(CompletedOn.HasValue)
             {
                  return (long)(CompletedOn.Value - unixEpoch).TotalMilliseconds; }
             }

              // CompletedOn is null, return something reasonable
             return long.MinValue;
        }
}