c# - 将 DateTime 转换为可为空的 long 时出错
问题描述
我很困惑,需要有人解释我如何做到这一点,因为我在这里缺少概念。下面的代码按预期工作,但我的目标是以滴答声(纪元)发送 StartDate。我想将 json 中的日期时间转换为 getter setter 属性中的刻度,而不是主类中的刻度。这甚至可能吗?如果是,请解释。因为当我将 Employee 类中的 DateTime 更改为 long 时,它将 06/05/2010 06:00:00 AM 转换为可为空的 long 时出现错误。先感谢您。
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
private string _startDate { get; set; }
public DateTime StartDate
{
get
{
return DateTime.Parse(_startDate);
}
set
{
_startDate = value.ToString();
}
}
}
static void Main(string[] args)
{
string input = "{ \"startDate\":\"06/05/2010 06:00:00 AM\", \"FirstName\":\"John\",\"LastName\":\"Smith\"}";
Employee emp = JsonConvert.DeserializeObject<Employee>(input);
Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {emp.StartDate.ToString()}");
Console.ReadLine();
}
当我这样做时出错
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
private string _startDate { get; set; }
public long? StartDate
{
get
{
return DateTime.Parse(_startDate).Ticks;
}
set
{
_startDate = value.ToString();
}
}
}
解决方案
您的设计存在根本问题:
private string _startDate { get; set; }
public long? StartDate
{
get
{
return DateTime.Parse(_startDate).Ticks;
}
set
{
_startDate = value.ToString();
}
}
当您使用 setter 时,您会将字符串设置为类似的"132332"
内容,但是当您使用 getter 时,您将无法将该值解析为 DateTime - 它不是有效的日期时间格式。
一种解决方法是将属性更改为:
public long? StartDate
{
get
{
return DateTime.Parse(_startDate).Ticks;
}
set
{
_startDate = new DateTime(value ?? 0).ToString();
}
}
我相信您可以使用序列化属性和 DateTime 支持字段来实现类似于您打算使用以下代码执行的操作:
public class MyClass
{
public static void Main(string[] args)
{
string input = "{ \"startDate\":\"06/05/2010 06:00:00 AM\", \"FirstName\":\"John\",\"LastName\":\"Smith\"}";
Employee emp = (Employee)JsonConvert.DeserializeObject<Employee>(input);
Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {new DateTime(emp.StartDate ?? 0)}");
}
}
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
[JsonProperty("startDate")]
private DateTime _startDate { get; set; }
[JsonIgnore]
public long? StartDate
{
get
{
return _startDate.Ticks;
}
set
{
_startDate = new DateTime(value ?? 0);
}
}
}
推荐阅读
- javascript - 根据匹配的键/值属性过滤对象数组?
- mongodb - Grails 3 使用 _id 和 id 保存 mongoDB 文档
- sql-server - 为什么日志传送数据库在链接服务器上不可见?
- python - 使用 ifelse 条件创建新列(python)
- java - 未知配置格式:hocon(支持的格式有:[json, raw, properties]
- c# - ASP.NET Core Web API 自动 JSON 参数反序列化不起作用
- python - JSON 模式语法检查器
- java - 正则表达式性能 java vs c++11
- sql - PostgreSQL:计数查询需要太多时间
- wpf - 停靠面板内的 xml 按钮消失