Some people asked a question about custom converter for System.Text.Json on Facebook .NET group.
He want user get the specific format from DateTimeOffset (not DateTime)
If using default converter, the result will follow ISO 8601 format
And the don't want to use ToString() to achieve it everytime, so the best way is add the custom converter to JsonOptions
The first step, we create a custom converter to override default JsonConverter
In Program.cs, modify code like this to add our custom converter into JsonOptions.
Write a test API return DateTimeOffset.UtcNow
And check the result. It worked.
If you only want to partial use the customer converter, here is the example.
That's all, hope this helps.
He want user get the specific format from DateTimeOffset (not DateTime)
DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fffzzz");
//"2022-06-22 06:28:55.207+00:00"
If using default converter, the result will follow ISO 8601 format
return DateTimeOffset.UtcNow;
//"2022-06-22T05:55:57.4313761+00:00"
And the don't want to use ToString() to achieve it everytime, so the best way is add the custom converter to JsonOptions
1. Create custom converter
The first step, we create a custom converter to override default JsonConverter
public class CustomDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
private readonly string Format;
public CustomDateTimeOffsetConverter(string format)
{
Format = format;
}
public override void Write(Utf8JsonWriter writer, DateTimeOffset date, JsonSerializerOptions options)
{
writer.WriteStringValue(date.ToString(Format));
}
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTimeOffset.ParseExact(reader.GetString(), Format, null);
}
}
2. Add into JsonOptions
In Program.cs, modify code like this to add our custom converter into JsonOptions.
3. Test the result
Write a test API return DateTimeOffset.UtcNow
And check the result. It worked.
4. Partial use
If you only want to partial use the customer converter, here is the example.
var options = new JsonSerializerOptions() { WriteIndented = true };
options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
options.Converters.Add(new CustomDateTimeOffsetConverter("yyyy-MM-dd HH:mm:ss.fffzzz"));
return JsonSerializer.Serialize(DateTimeOffset.UtcNow, options);
//"2022-06-22 07:05:11.191+00:00"
That's all, hope this helps.
No comments:
Post a Comment