Wednesday, June 22, 2022

[.NET 6] Custom Converter for System.Text.Json

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)

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