Categories
.net-core .net-core-3.0 c# json system.text.json

JsonConverter equivalent in using System.Text.Json

I’m starting to migrate some code I have from Newtonsoft.Json to System.Text.Json in a .net Core 3.0 app.

I migrated the properties from

[JsonProperty("id")] to [JsonPropertyName("id")]

but I have some properties decorated with the JsonConverter attribute as:

[JsonConverter(typeof(DateTimeConverter))]
[JsonPropertyName("birth_date")]
DateTime BirthDate{ get; set; }

But I cannot find the equivalent of this Newtonsoft converter in System.Text.Json Does someone know how can this be achieved in .net Core 3.0?

Thanks!

System.Text.Json now supports custom type converters in .NET 3.0 preview-7 and above.

You can add converters that match on type, and use the JsonConverter attribute to use a specific converter for a property.

Here’s an example to convert between long and string (because javascript doesn’t support 64-bit integers).

public class LongToStringConverter : JsonConverter<long>
{
public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
// try to parse number directly from bytes
ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) && span.Length == bytesConsumed)
return number;
// try to parse from a string if the above failed, this covers cases with other escaped/UTF characters
if (Int64.TryParse(reader.GetString(), out number))
return number;
}
// fallback to default handling
return reader.GetInt64();
}
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}

Register the converter by adding it to the Converters list in JsonSerializerOptions

services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new LongToStringConverter());
});

Note: The current release doesn’t support nullable types yet.