Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DateTime转换为可为空的long时出错_C#_Serialization - Fatal编程技术网

C# 将DateTime转换为可为空的long时出错

C# 将DateTime转换为可为空的long时出错,c#,serialization,C#,Serialization,我很困惑,需要有人向我解释如何做到这一点,因为我在这里缺少概念。下面的代码按预期工作,但我的目标是以ticks(历元)形式发送StartDate。我想将json中的datetime转换为getter setter属性中的ticks,而不是主类中的ticks。这可能吗?如果是,请解释。因为当我将Employee类中的DateTime更改为long时,将06/05/2010 06:00:00 AM转换为可为null的long会引发错误。先谢谢你 public class Employee

我很困惑,需要有人向我解释如何做到这一点,因为我在这里缺少概念。下面的代码按预期工作,但我的目标是以ticks(历元)形式发送StartDate。我想将json中的datetime转换为getter setter属性中的ticks,而不是主类中的ticks。这可能吗?如果是,请解释。因为当我将Employee类中的DateTime更改为long时,将06/05/2010 06:00:00 AM转换为可为null的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();
    }

您的设计存在一个基本问题:

private string _startDate { get; set; }

public long? StartDate
{
    get
    {
        return DateTime.Parse(_startDate).Ticks;
    }
    set
    {
        _startDate = value.ToString();
    }
}
当您使用setter时,您将字符串设置为类似于
“132332”
,但是当您使用getter时,您将无法将该值解析为日期时间-它不是有效的日期时间格式

一种修复方法是将属性更改为:

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);
        }
    }
}
公共类MyClass
{
公共静态void Main(字符串[]args)
{
字符串输入=“{\'startDate\”:\“06/05/2010 06:00:00 AM\”,“FirstName\”:“John\”,“LastName\”:“Smith\”;
Employee emp=(Employee)JsonConvert.DeserializeObject(输入);
Console.WriteLine($“{emp.FirstName}{emp.LastName}的开始日期是{new DateTime(emp.StartDate??0)}”);
}
}
公营雇员
{        
公共字符串名{get;set;}
公共字符串LastName{get;set;}
[JsonProperty(“startDate”)]
私有日期时间_startDate{get;set;}
[JsonIgnore]
公共长?起始日期
{
得到
{
返回_startDate.Ticks;
}
设置
{
_startDate=新的日期时间(值??0);
}
}
}

考虑到您试图将StartDate属性更改为long,我假设您希望JSON既不是Microsoft的,也不是Javascript的,类似于日期(123345)或新日期(12345),而只是纪元

这就是您需要做的全部工作:

    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        [JsonConverter(typeof(UnixDateTimeConverter))]
        public DateTime StartDate { get; set; }
    }

    static void Main(string[] args)
    {
        string input = "{ \"startDate\": 1591399624, \"FirstName\":\"John\",\"LastName\":\"Smith\"}";

        Employee emp = JsonConvert.DeserializeObject<Employee>(input);
        Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {emp.StartDate.ToString()}");

        var json = JsonConvert.SerializeObject(emp);
        Console.WriteLine(json);
        Console.ReadLine();            
    }

为什么要将
Employee.StartDate
存储在
string
备份字段中,而不仅仅使用自动属性(即
public DateTime StartDate{get;set;}
)?
    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        [JsonConverter(typeof(UnixDateTimeConverter))]
        public DateTime StartDate { get; set; }
    }

    static void Main(string[] args)
    {
        string input = "{ \"startDate\": 1591399624, \"FirstName\":\"John\",\"LastName\":\"Smith\"}";

        Employee emp = JsonConvert.DeserializeObject<Employee>(input);
        Console.WriteLine($"{emp.FirstName} {emp.LastName}'s start date is {emp.StartDate.ToString()}");

        var json = JsonConvert.SerializeObject(emp);
        Console.WriteLine(json);
        Console.ReadLine();            
    }
John Smith's start date is 6/5/2020 11:27:04 PM
{"FirstName":"John","LastName":"Smith","StartDate":1591399624}