C# 如何处理DateTime的JSON数据成员中的空值
我从我的服务接收到一个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" } } “
{
"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;
}
}