C# JSON反序列化后日期格式变更:如何保留原UTC格式
如何保留UTC时间的原序列化格式(带7位小数和Z后缀)
现有
BuildJson<T>方法,接收JSON字符串后先反序列化再重新序列化。原始JSON中的StatusDateTimeUTC字段格式为"2020-11-15T11:37:08.0000000Z",但经过反序列化再序列化后,格式变为"2020-11-15T11:37:08+00:00",希望保留原UTC格式。尝试在反序列化时设置DateTimeZoneHandling.Utc或结合MicrosoftDateFormat均未生效。
原始代码参考
原始JSON:
string body = "{ \"IdentityNumber\" :660045,\r\n \"ResolutionStatusId\" :3,\r\n \"StatusDateTimeUTC\" :\"2020-11-15T11:37:08.0000000Z\",\r\n \"OutcomeId\" :3}";
原始BuildJson方法:
private string BuildJson<T>(string body, string operation) { AMSDto<T> aMSDto = new AMSDto<T>(); aMSDto.Body = JsonConvert.DeserializeObject<T>(body); NistMapping.AddHeaders<T>(aMSDto, operation); return JsonConvert.SerializeObject(aMSDto); }
尝试过的无效配置(仅作用于反序列化环节):
// 配置1 aMSDto.Body = JsonConvert.DeserializeObject<T>(body, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc }); // 配置2 var microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Utc }; aMSDto.Body = JsonConvert.DeserializeObject<T>(body, microsoftDateFormatSettings);
问题根源
反序列化时DateTime对象已经正确解析为UTC时间,但序列化环节的默认格式与原始格式不符,之前的配置仅作用于反序列化,未影响最终的序列化输出。
正确配置方案
在调用JsonConvert.SerializeObject时,传入自定义的序列化配置,指定日期格式为yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'(匹配原始的7位小数+Z后缀格式),同时确保时区处理为UTC:
修改后的BuildJson方法:
private string BuildJson<T>(string body, string operation) { AMSDto<T> aMSDto = new AMSDto<T>(); // 反序列化无需特殊配置,默认即可正确解析UTC时间 aMSDto.Body = JsonConvert.DeserializeObject<T>(body); NistMapping.AddHeaders<T>(aMSDto, operation); // 序列化时指定格式配置 var serializeSettings = new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'" }; return JsonConvert.SerializeObject(aMSDto, serializeSettings); }
配置说明
DateTimeZoneHandling.Utc:确保序列化时将DateTime对象以UTC时区输出DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'":强制输出7位小数的秒数,并且固定后缀为Z,完全匹配原始格式
如果需要全局生效该配置,可设置默认序列化规则:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatString = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'" };
内容的提问来源于stack exchange,提问作者Alan Tsai
相关产品推荐
相关产品推荐

