How deserialize TimeSpan in .NET 6 serialized with .NET 5?
Trouble deserialize TimeSpan from .NET 5 to .NET 6?
This time we were migrating to .NET 6 and we had problem with serialized values from .NET 5 which where saved in our document database as a object. To fix this issue we made our custom converter.using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Tutorial.JsonConverters.PixelEncounter
{
public class TimeSpanConverter : JsonConverter<TimeSpan>
{
public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (TryParseOldTimespanObject(ref reader, out TimeSpan ts))
{
return ts;
}
return TimeSpan.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
private static bool TryParseOldTimespanObject(ref Utf8JsonReader reader, out TimeSpan ts)
{
ts = TimeSpan.Zero;
if (reader.TokenType == JsonTokenType.StartObject)
{
var ticksPropertyName = "";
var ticks = 0L;
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
break;
}
if (reader.TokenType == JsonTokenType.PropertyName)
{
ticksPropertyName = reader.GetString();
continue;
}
SetTicksIfPropertyFound(ref reader, ticksPropertyName, ref ticks);
// Read until EndObject is required.
}
ts = new TimeSpan(ticks);
return true;
}
return false;
}
private static void SetTicksIfPropertyFound(ref Utf8JsonReader reader, string ticksPropertyName, ref long ticks)
{
if (ticksPropertyName == "Ticks" && reader.TokenType == JsonTokenType.Number)
{
ticks = reader.GetInt64();
}
}
}
}
Comments
Post a Comment