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.