代码之家  ›  专栏  ›  技术社区  ›  Matt Spinks

Hw从JsonNet序列化DateTimeOffset?

  •  0
  • Matt Spinks  · 技术社区  · 6 年前

    我正在尝试将模型序列化为Json格式。这是我的模型:

        public class UemSiteAvailabilityDetailsRec
        {
            public string UemAlias;
            public string IpAddress;
            public DateTimeOffset Date;
            public string PlannedOutage;
            public string Severity;
            public string SiteName;
            public string SiteNumber;
            public string SourceAgentIp;
            public string Message;
        }
    

    这是我序列化模型实例的代码:

    var rec = //GETTING REC FROM DATABASE
    var val = JsonNet.Serialize(rec);
    

    在那之后,我的 val

    {
        "UemAlias": "***.***.**.**",
        "IpAddress": "***.***.**.**",
        "Date": {
            "DateTime": "01\/24\/2019 00:00:21",
            "UtcDateTime": "01\/24\/2019 06:00:21",
            "LocalDateTime": "01\/24\/2019 00:00:21",
            "Date": "01\/24\/2019 00:00:00",
            "Day": 24,
            "DayOfWeek": 4,
            "DayOfYear": 24,
            "Hour": 0,
            "Millisecond": 800,
            "Minute": 0,
            "Month": 1,
            "Offset": {
                "Ticks": -216000000000,
                "Days": 0,
                "Hours": -6,
                "Milliseconds": 0,
                "Minutes": 0,
                "Seconds": 0,
                "TotalDays": -0.25,
                "TotalHours": -6,
                "TotalMilliseconds": -21600000,
                "TotalMinutes": -360,
                "TotalSeconds": -21600
            },
            "Second": 21,
            "Ticks": 636838848218000000,
            "UtcTicks": 636839064218000000,
            "TimeOfDay": {
                "Ticks": 218000000,
                "Days": 0,
                "Hours": 0,
                "Milliseconds": 800,
                "Minutes": 0,
                "Seconds": 21,
                "TotalDays": 0.000252314814814815,
                "TotalHours": 0.00605555555555556,
                "TotalMilliseconds": 21800,
                "TotalMinutes": 0.363333333333333,
                "TotalSeconds": 21.8
            },
            "Year": 2019
        },
        "PlannedOutage": "No",
        "Severity": "Critical",
        "SiteName": "BA_ISSI",
        "SiteNumber": null,
        "SourceAgentIp": null,
        "Message": "SITE TRUNKING, DEVICE CRITICAL MALFUNCTION"
    }
    

    正如你所看到的,我的日期对象看起来里面的东西比我需要的要多。稍后,当我尝试像这样反序列化字符串时:

    var rec = JsonConvert.DeserializeObject<UemSiteAvailabilityDetailsModel>(val);
    

    我得到了错误。。。

    分析值时遇到意外字符:{.Path“Date”, 第1行,第64位|

    如何使序列化函数 DateTimeOffset 序列化更简洁且不会导致错误?

    1 回复  |  直到 6 年前
        1
  •  2
  •   TheFastCat    6 年前

    在我的.Net核心项目中,我无法访问Newtonsoft(据我所知)。

    不确定这是否是实现要求,但是 可用于.NETCore的Newtonsoft.jsonNuGet包(当前版本为12.0.1)。因此,如果您能够重新实现您的解决方案以利用它,您可以通过安装它然后使用它来解决问题:

    using System;
    using Newtonsoft.Json;
    
    namespace ConsoleApp
    {
        public class Program
        {
            public class UemSiteAvailabilityDetailsRec
            {
                public string UemAlias;
                public string IpAddress;
                public DateTimeOffset Date = new DateTimeOffset(new DateTime(1980, 7, 7));
                public string PlannedOutage;
                public string Severity;
                public string SiteName;
                public string SiteNumber;
                public string SourceAgentIp;
                public string Message;
            }
    
            static void Main(string[] args)
            {
                var toSerialize = new UemSiteAvailabilityDetailsRec();
                string val = JsonConvert.SerializeObject(toSerialize);
                Console.WriteLine(val);
                Console.ReadKey();
            }
    
        }
    }
    

    {
        "UemAlias": "",
        "IpAddress": null,
        "Date": "1980-07-07T00:00:00-05:00",
        "PlannedOutage": null,
        "Severity": null,
        "SiteName": null,
        "SiteNumber": null,
        "SourceAgentIp": null,
        "Message": null
    }