使用System.Text.Json反序列化UTC/Zulu格式时间字符串的问题
解决System.Text.Json反序列化Zulu格式时间的问题
首先明确:你提到的小数点后到Z之前的数字是小数秒(这里精确到7位,即100纳秒级别),不是UTC偏移量,末尾的Z才是UTC时区的标记(等同于+00:00)。
方案一:无需自定义转换器,直接用内置支持
System.Text.Json默认支持这种标准ISO 8601格式的Zulu时间,可能你之前的自定义转换器反而导致了冲突。按以下步骤处理:
- 定义匹配的实体类:
public class TimeResponse { [JsonPropertyName(".issued")] public DateTimeOffset Issued { get; set; } [JsonPropertyName(".expires")] public DateTimeOffset Expires { get; set; } }
- 反序列化时配置正确的选项:
var json = "{\"issued\":\"2023-03-01T13:26:35.1134406Z\",\"expires\":\"2023-03-01T21:26:35.1134406Z\"}"; var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 可选,避免大小写匹配问题 DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; var result = JsonSerializer.Deserialize<TimeResponse>(json, options);
方案二:自定义转换器(特殊场景需求)
如果确实需要自定义转换器处理,确保格式字符串正确匹配小数秒部分:
- 实现正确的转换器:
public class DateTimeOffsetZuluConverter : JsonConverter<DateTimeOffset> { // 匹配7位小数秒的Zulu格式 private const string ZuluFormat = "yyyy-MM-dd'T'HH:mm:ss.FFFFFFF'Z'"; public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var dateString = reader.GetString(); // 优先按指定格式解析 if (DateTimeOffset.TryParseExact(dateString, ZuluFormat, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateOffset)) { return dateOffset; } // fallback到内置解析,兼容格式细微变化 return DateTimeOffset.Parse(dateString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); } public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(ZuluFormat, CultureInfo.InvariantCulture)); } }
- 使用转换器反序列化:
var options = new JsonSerializerOptions(); options.Converters.Add(new DateTimeOffsetZuluConverter()); var result = JsonSerializer.Deserialize<TimeResponse>(json, options);
关键注意点
- 格式字符串中
FFFFFFF对应最多7位小数秒,和接口返回的格式完全匹配; - 解析时指定
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,确保将Z标记的时间正确解析为UTC时间。
内容的提问来源于stack exchange,提问作者Ducky
相关产品推荐
相关产品推荐

