当前位置: 首页 > 编程语言 > C#

Json.Net在序列化时弄乱了DateTimeOffset的时区分享

时间:2023-04-10 13:05:09 C#

C#学习教程:Json.Net在序列化时把DateTimeOffset的时区搞乱我正在尝试用UTC序列化所有内容。这是我的代码:classClass1{staticvoidMain(){Class2foo=newClass2();JObjectjson=JObject.Parse(JsonConvert.SerializeObject(foo,newJsonSerializerSettings(){DateParseHandling=DateParseHandling.DateTimeOffset,DateFormatHandling=DateFormatHandling.IsoDateFormat,DateTimeZoneHandling=DateTimeZoneHandling.Utc}));Console.WriteLine(json.ToString());控制台.Read();}}classClass2{publicDateTimeOffsettime=newDateTimeOffset(newDateTime(1970,1,1,0,0,0,DateTimeKind.Utc).AddTicks(14663484000000000));publicDateTimeOffsettime2=newDateTime(1970,1,1,0,0,0,DateTimeKind.Utc).AddTicks(14663484000000000);publicDateTimeOffsettime2=DateTimenewDateTime(14663484000000000);}这是输出:{“时间”:“2016-06-19T08:00:00-07:00”,“time2”:“2016-06-19T08:00:00-07:00”,“time3”:"0047-06-20T15:00:00Z"}这是我想要得到的输出:{"time":"2016-06-19T15:00:00+00:00","time2":"2016-06-19T15:00:00+00:00","time3":"0047-06-20T15:00:00+00:00"}如你所见,DateTimeOffset属性根本不转换DateTime,但时区以Z表示,我正在尝试使用+00:00。在您的代码中,您正在执行以下操作:使用特定的DateTime相关序列化设置将Class2的实例序列化为JSON字符串。在不使用这些设置的情况下反序列化JToken层次结构。(对层次结构的其他修改-未显示。)在不使用这些设置的情况下,JToken层次结构再次序列化为JToken最终字符串(通过json.ToString())。执行此操作时,在步骤1中选择的日期的格式设置将丢失。要解决此问题,您需要在每次从JSON字符串表示序列化时应用该设置,因为如本文档页面所述,JSON没有日期的“官方”格式。因此,只要将日期转换为JSON字符串表示形式,Json.NET就会应用启发式方法来识别日期并设置日期格式——您不必执行一次,而是执行三次。你可以这样做:varsettings=newJsonSerializerSettings(){DateParseHandling=DateParseHandling.DateTimeOffset,DateFormatHandling=DateFormatHandling.IsoDateFormat,DateTimeZoneHandling=DateTimeZoneHandling.Utc};//生成初始序列化varinitialString=JsonConvert.Serialize(/解析回JTokenvarjson=JsonConvert.DeserializeObject(initialString,settings);//根据需要进行修改//json["foo"]="bar";//GeneratefinalJSON.varfinalString=JsonConvert.SerializeObject(json,Formatting.Indented,settings);为了提高效率,您可以使用JToken.FromObject()(如果愿意,也可以使用JObject.FromObject())生成JToken层次结构,而无需创建和解析初始字符串表示:varsettings=newJsonSerializerSettings(){DateParseHandling=DateParseHandling.DateTimeOffset,DateFormatHandling=DateFormatHandling.IsoDateFormat,DateTimeZoneHandling=DateTimeZoneHandling.Utc};varjson=JToken.FromObject(foo,JsonSerializer.CreateDefault(settings)ific);//制作模组根据需要设置//json["foo"]="bar";//生成最终的JSON.varfinalString=JsonConvert.SerializeObject(json,Formatting.Indented,settings);但请注意,出于以下原因,Json.NET将以“0047-06-20T15:00:00Z”格式开始输出UTC日期时间而不是“2016-06-19T15:00:00+00:00”如果您需要以DateTimeOffset格式序列化UTCDateTime属性,您可能需要使用自定义转换器。以上是C#学习教程:Json.Net在序列化时弄乱了DateTimeOffset的时区共享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: