如何使用 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
将具有所需格式的日期时间。
我正在使用 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
将具有所需格式的日期时间。