如何使用 JsonSerializer 为日期指定默认时区?

How specify default a timezone for dates with a JsonSerializer?

我正在使用 System.Text.Json 来解析 json 数据。其中包含一个没有任何关联时间的归档日期。解析确实有效,我得到了一个日期时间,但是日期时间缺少时区,我发送它的网关由于缺少时区而拒绝它。

我碰巧知道这个的默认时区是infect GMT+2问题是如何强制它在解析过程中添加时区。

为您的测试带来乐趣的简单示例。

我有一个简单的 class,里面有一个日期。

public class Testclass
{

    public DateTime RecordedDate { get; set; }
}

然后我有一个Json字符串

 var json = "{ \"RecordedDate\": \"2017-11-22\"}"; 

然后我尝试解析。

  var response =  JsonSerializer.Deserialize<Testclass>(json);

解析确实有效,但它不包含时区,有没有办法指定默认时区?

我认为这是默认设置。

据我所知,在反序列化(或序列化)过程中,不应处理时区转换。我认为这些主题应该分开。

如果我是你,我会在你的过程中得到 DateTime 后使用 TimeZoneInfo.ConvertTime 方法(或类似的方法)。当然,这 可能 取决于您的代码逻辑。

你可能想检查一下;

另一方面,Json.NET supports DateTimeZoneHandling 也可能用于反序列化。

您可以创建一个 DateTimeConvertor 并根据需要处理转换。

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.SpecifyKind(DateTime.Parse(reader.GetString()), DateTimeKind.Utc);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {          
        writer.WriteStringValue(DateTime.SpecifyKind(value, DateTimeKind.Utc));
    }
}

在 serializing/deserializing 期间使用转换器。

JsonSerializerOptions options = new JsonSerializerOptions();

options.Converters.Add(new DateTimeConverter());

var response = JsonSerializer.Deserialize<Testclass>(json, options);

var responseJson = JsonSerializer.Serialize(response, options);

responseJson 将具有所需格式的日期时间。