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

Popular Posts